1

我正在尝试制作一个方形的自定义视图,使用宽度作为高度。我还使用了一个预定义的布局,我将它作为 UI 进行扩展。一旦我覆盖 onMeasure,自定义视图就不再出现。这是我的代码:

public class MyView extends RelativeLayout{

    public MyView(Context context) {
        super(context);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        addView(setupLayout(context));
    }

    private View setupLayout(Context context) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View myView = inflater.inflate(R.layout.view_layout, null);
        return myView;
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(widthMeasureSpec));
    }

}

我有两个问题:

  1. 如何覆盖 onMeasure 以便它以我期望的方式绘制我的视图?
  2. 有什么方法可以让我在视图层次结构方面更有效(即不将RelativeLayout放在RelativeLayout中)
4

1 回答 1

1

您可以使用Jan Němec 对类似问题的回答中的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class SquareLayout extends LinearLayout {

public SquareLayout(Context context) {
    super(context);
}

public SquareLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

     @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);

        if (width > (int)(mScale * height + 0.5)) {
            width = (int)(mScale * height + 0.5);
        } else {
            height = (int)(width / mScale + 0.5);
        }

        super.onMeasure(
                MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
        );
    }
    }

或者尝试使用这个库项目。

于 2012-06-30T20:03:08.953 回答