我是Android新手,我在查找如何以编程方式在RelativeLayout中布局视图时遇到问题。我想要做的是在RelativeLayout容器的中心创建具有一定半径(比如50px)的4个圆(子视图),所以看起来我在RelativeLayout的中心有一个假想的正方形,并且每个顶点都是其中一个圈子的中心。
我可以在视图中绘制圆圈;这很简单:)
class CircleView extends View { ... protected void onDraw(Canvas canvas) { // draw circle on canvas } }
我无法弄清楚如何布局视图。它似乎将它们绘制在彼此之上,即使我为每个子视图设置LayoutParams和Id。
class Circles extends RelativeLayout { public Circles(Context c) { super(c); addChildViews(); } ... private void addChildViews() { final Context c = getContext(); final CircleView v0 = new CircleView(c); v0.setId(0); final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.LEFT_OF, 1); params.addRule(RelativeLayout.ABOVE, 2); v0.setLayoutParams(params); addView(v0); .... // and so on, with relative layout params for other 3 views } }
请问有人让我走上正轨吗?我也不知道我是否在绘图周期中的正确时间调用addChildViews,如果这是导致它们被绘制在彼此之上的原因。非常感谢您的帮助。
答案 0 :(得分:0)
两件事
1)View的默认操作是填充其父级,因此通过应用(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)作为LayoutParams,您将创建四个视图,其高度和宽度与父布局的大小相同(大概是屏幕),所以你只能看到一个,因为其他人会被放在屏幕外。
要解决此问题,请将您希望圆圈的大小设置为LayoutParms,
float dpi = getResources().getDisplayMetrics().density;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int)(50.0f * dpi), (int)(50.0f * dpi));
或者您可以在圆圈视图中覆盖onMeasure(int x,int y)方法,如此
@Override
public void onMeasure(int x, int y) {
float dpi = getResources().getDisplayMetrics().density;
setMeasuredDimension((int)(50.0f * dpi), (int)(50.0f * dpi));
}
2)不要将你的视图ID设置为0 ...我不记得它是系统保留还是什么,但它不能很好用。
此外,如果您希望所有圆圈都在圆圈中居中,那么您需要将其重力设置为中心。
public class Circles extends RelativeLayout {
public Circles (Context ctx) {
super(ctx);
this.setGravity(Gravity.CENTER);
addViewChildren();
}
这将使所有圈子儿童居中,为您提供所需的结果。