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
这个标记