// widthMeasureSpec是一个int值,前两位代表模式,后面30位代表数值,有三种mode:
// EXACTLY: 当layout_width = 100dp 或 layout_width = match_parent时
// AT_MOST:当layout_width = wrap_content时
// UNSPECIFIED:一般自定义的时候才会用,要多大有多大
// 如果不override的话,默认是按EXACTLY模式来处理的, 看如下代码:
// public static int getDefaultSize(int size, int measureSpec) {
// int result = size;
// int specMode = MeasureSpec.getMode(measureSpec);
// int specSize = MeasureSpec.getSize(measureSpec);
// switch (specMode) {
// case MeasureSpec.UNSPECIFIED:
// result = size;
// break;
// case MeasureSpec.AT_MOST:
// case MeasureSpec.EXACTLY:
// result = specSize;
// break;
// }
// return result;
// }
// an example
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 一定要用setMeasureDimension
setMeasureDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
// 这里才是处理mode的关键,默认的getDefaultSize()统统处理成EXACTLY模式
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if(specMode == MeasureSpec.EXACTLY) {
// set width 20 px wider
result = MeasureSpec.makeMeasureSpec(specSize + 20, MeasureSpec.EXACTLY);
}
else {
result = 200;//要控制不要超过parent的大小
if(specMode == MeasureSpec.AT_MOST) {]
int size = Math.min(result, specSize);
result = MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST);
}
}
return result;
}
override onMeasure()
最新推荐文章于 2023-08-10 11:04:33 发布