自定义 View/ViewGoup 支持 wrap_content 和 padding
对于 View:
wrap_content 对应 AT_MOST 模式,在自定义 View 的 onMeasure 中可以给予一个初始值,与测量结果 MeasureSpec 中的 size 进行比较,取其中的最小者。onMeasure() {
int width = getDefaultSize(widthMeasureSpec);
int height = getDefaultSize(heightMeasureSpec);
setMeasuredDimension(width, height);
}
getDefaultSize(int measureSpec) {
int result = 200;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
switch(mode) {
case MeasureSpec.UNSPECIFICED:
case MeasureSpec.EXACTLY:
result = size;
break;
case MeasureSpec.AT_MOST:
result = Math.min(result, size);
break;
}
return result;
}
对于 ViewGroup:
遍历所有子 View,获取子 View 的 MeasureSpec,把当前 ViewGroup 的 margin 和 padding 加上子 View LayoutParams 中的 width 得到 childMeasureSpec,最后调用 child.measure