Android自定义view之onMeasure

在Android 自定义view方法中onMeasure()用于绘测自身的view大小,我们也可通过复写计算出view的内容的起止位置,也可将自身的大小通过setMeasuredDimension(int,int)将自身大小传递给父view。

需要注意两点

  • 1,一般情况重写onMeasure()方法作用是为了自定义View尺寸的规则,如果你的自定义View的尺寸是根据父控件行为一致,就不需要重写onMeasure()方法。
  • 2,如果不重写onMeasure方法,那么自定义view的尺寸默认就和父控件一样大小,当然也可以在布局文件里面写死宽高,而重写该方法可以根据自己的需求设置自定义view大小。
    常见的使用示例如下:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //获取建议的最小高度
        final int minimumHeight = getSuggestedMinimumHeight();
        //获取建议的最小宽度
        final int minimumWidth = getSuggestedMinimumWidth();
        int width = measureWidth(minimumWidth, widthMeasureSpec);
        int height = measureHeight(minimumHeight, heightMeasureSpec);
        //设置测量的尺寸,用于父布局进行view排列
        setMeasuredDimension(width, height);
    }
    
    private int measureWidth(int defaultWidth, int measureSpec) {
        //获取测量的模式
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch (specMode) {
            case MeasureSpec.AT_MOST://wrap_content
                defaultWidth = /*内容视图大小+*/defaultWidth + getPaddingRight() + getPaddingLeft();
                break;
            case MeasureSpec.EXACTLY://固定值,match_parent
                defaultWidth = specSize;
                break;
            case MeasureSpec.UNSPECIFIED://0dp,空值
                defaultWidth = Math.max(defaultWidth, specSize);
        }
        return defaultWidth;
    }
    
    private int measureHeight(int defaultHeight, int measureSpec) {
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch (specMode) {
            case MeasureSpec.AT_MOST://wrap_content
                defaultHeight = /*内容视图大小+*/defaultHeight + getPaddingTop() + getPaddingBottom();
                break;
            case MeasureSpec.EXACTLY:
                defaultHeight = specSize;
                break;
            case MeasureSpec.UNSPECIFIED://0dp,空值
                defaultHeight = Math.max(defaultHeight, specSize);
                break;
        }
        return defaultHeight;
    }

发表回复

CAPTCHAis initialing...