@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mChildCount= getChildCount.size();
if (mChildCount== 0) {
setMeasuredDimension(0, 0);
} else {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (heightMode == MeasureSpec.EXACTLY) {
//.......
} else if (heightMode == MeasureSpec.AT_MOST) {
//.......
} else {
//.......
}
setMeasuredDimension(mWidth, mHeight);
}
}
使用一下便捷方式
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desireWidthSize = 0;
int width =resolveSize(desireWidthSize, widthMeasureSpec);
int desireHeightSize= 0;
int height = resolveSize(desireHeightSize, heightMeasureSpec);
setMeasuredDimension(width, height);
}
//查看源码
/**
* Version of {@link #resolveSizeAndState(int, int, int)}
* returning only the {@link #MEASURED_SIZE_MASK} bits of the result.
*/
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); //获取size,mode
final int result;
switch (specMode) {
case MeasureSpec.AT_MOST://如果是AT_MOST
if (specSize < size) { //自动判断
result = specSize | MEASURED_STATE_TOO_SMALL;
} else {
result = size;
break;
case MeasureSpec.EXACTLY:
result = specSize; //EXACTLY,测出来多大 ,就返回多大
break;
case MeasureSpec.UNSPECIFIED:
default:
result = size; //UNSPECIFIED,那就返回你需要的size
}
return result | (childMeasuredState & MEASURED_STATE_MASK);
}
view onMeasure中利器resolveSize
最新推荐文章于 2021-05-27 04:39:12 发布