自定义View测量

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val size = 200f.dp
        super.onMeasure(widthMeasureSpec, heightMeasureSpec) //通过父view测量自己的宽高
        measuredWidth  //获取测量后的宽度,在重写onMeasure中记得使用这个值
        measuredHeight //获取测量后的高度
        width  //获取实际宽度 ,在其他地方记得用我哦,我准
        height
        setMeasuredDimension(size.toInt(), size.toInt()) //重新设置view大小
    }

public final int getMeasuredWidth() {
        return mMeasuredWidth & MEASURED_SIZE_MASK;
    }

public final int getWidth() {
        return mRight - mLeft;
    }

        val widthMode = MeasureSpec.getMode(widthMeasureSpec) //获取父类给的建议模式
        val widthSize = MeasureSpec.getSize(widthMeasureSpec) //获取父类给的建议大小
        size = when(widthMode) {
            MeasureSpec.AT_MOST-> min(size,widthSize) // 别超我就行,所以得那最小值当size
            MeasureSpec.EXACTLY-> widthSize           // 确定值,不能改
            MeasureSpec.UNSPECIFIED -> size           // 不限制了,随便你吧
            else -> size
        }

这其实是一套模板代码,Google有封装
size = resolveSize(size,widthSize)
public static int resolveSize(int size, int measureSpec) {
        return resolveSizeAndState(size, measureSpec, 0) & MEASURED_SIZE_MASK;
    }
public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
        final int specMode = MeasureSpec.getMode(measureSpec);
        final int specSize = MeasureSpec.getSize(measureSpec);
        final int result;
        switch (specMode) {
            case MeasureSpec.AT_MOST:
                if (specSize < size) {
                    result = specSize | MEASURED_STATE_TOO_SMALL;
                } else {
                    result = size;
                }
                break;
            case MeasureSpec.EXACTLY:
                result = specSize;
                break;
            case MeasureSpec.UNSPECIFIED:
            default:
                result = size;
        }
        return result | (childMeasuredState & MEASURED_STATE_MASK);
    }
我们一般不直接使用resolveSizeAndState,Google的viewgroup都还没有适配MEASURED_STATE_TOO_SMALL
这个标记
posted @ 2021-07-02 09:42  c-若曦  阅读(69)  评论(0)    收藏  举报