自定义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大小
    }
<p>public final int getMeasuredWidth() {
return mMeasuredWidth & MEASURED_SIZE_MASK;
}</p>
<p>public final int getWidth() {
return mRight - mLeft;
}</p>
<pre><code>    val widthMode = MeasureSpec.getMode(widthMeasureSpec) //获取父类给的建议模式
    val widthSize = MeasureSpec.getSize(widthMeasureSpec) //获取父类给的建议大小
    size = when(widthMode) {
        MeasureSpec.AT_MOST-&gt; min(size,widthSize) // 别超我就行,所以得那最小值当size
        MeasureSpec.EXACTLY-&gt; widthSize           // 确定值,不能改
        MeasureSpec.UNSPECIFIED -&gt; size           // 不限制了,随便你吧
        else -&gt; 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 这个标记