onMeasure (int widthMeasureSpec, int heightMeasureSpec)方法是用于测量控件的宽高:
在View中 测量视图和它的内容来确定测量的宽度和测量身高
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
代码中 通过setMeasuredDimension(int,int)方法来存储控件的宽高,通过getDefaultSize(int,int)计算默认的宽度和高度,返回给setMeasuredDimension;
其中getDefaultSize(int,int) 传入了两个参数 一个是计算出控件最小的宽高,一个是他的模式:
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;
}
这里可以看出如果measureSpec是MeasureSpec.UNSPECIFIED模式他就返回最小的宽高,如果是 MeasureSpec.AT_MOST和 MeasureSpec.EXACTLY模式他就返回
MeasureSpec的size值;