1、MeasureSpec类
32位的int值,高2位时测量模式,低30位时测量大小。
2、模式简介
EXACTLY:精确值模式,layout_width、layout_height指定具体值或者match_parent时。
AT_MOST:最大值模式,layout_width、layout_height指定为wrap_content时,控件大小随着子控件或内容的变化而变化,此时控件的大小只要不超过父控件允许的最大值即可。
UNSPECIFIED:它不指定大小的测量模式,View想多大就多大,通常用在绘制自定义View。
View默认的onMesure()只支持EXACTLY模式,想要支持wrap_content,必须重写onMesure()来指定wrap_content时view的大小。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
super.onMeasure会调用setMeasuredDimension(int measuredWidth, int measuredHeight)方法,将测量后的宽高值设置进入。
代码模板
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),measureWidth(heightMeasureSpec));
}
private int measureWidth(int widthMeasureSpec){
int result = 0;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode==MeasureSpec.EXACTLY){
result = specSize;
}else
{
result = 200;
if (specSize==MeasureSpec.AT_MOST){
result = Math.min(result,specSize);
}
}
return result;
}