自定义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-> 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 这个标记
评论区