简单的Android UI - RelativeLayout中的Circles(子视图)

时间:2011-05-06 03:27:30

标签: android relativelayout

我是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,如果这是导致它们被绘制在彼此之上的原因。非常感谢您的帮助。

1 个答案:

答案 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();
        }

这将使所有圈子儿童居中,为您提供所需的结果。