Android View的测量
在绘制View之前,要对整个View进行测量,这个过程就在onMeasure()方法中进行的。
测量的模式
- EXACTLY
- 精确值模式,当控件的width和height设置为具体值或者match_parent时就是这个模式
- UNSPECIFIED
- 这个属性不指定测量的模式,View想多大就多大
- AT_MOST
- 最大值模式,当控件的width和height设置为wrap_context时就是这个模式,控件的大小随着子控件的大小而变化
其中View类默认的onMeasure()方法只支持EXACTLY模式,所以说如果不重写onMeasure()方法的话就只能使用EXACTLY模式。
一言不合上代码
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setBackgroundColor(Color.BLUE);
}
这里我只给当前自定义View设置了一个背景颜色,然后在XML中设置成wrap_content
<com.github.wanglu1209.CustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
运行起来就是这样全屏的,下面我们还是这个例子,重写onMeasure()方法
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int specMode, specSize = 0;
int mWidth, mHeight;
/**
* Measure Width
*/
specMode = MeasureSpec.getMode(widthMeasureSpec);
switch (specMode){
case MeasureSpec.AT_MOST: //wrap_content
specSize = 200;
break;
case MeasureSpec.EXACTLY: //math_content 和 精确值
specSize = MeasureSpec.getSize(widthMeasureSpec);
break;
case MeasureSpec.UNSPECIFIED:
specSize = 400;
break;
}
mWidth = specSize;
/**
* Measure Height
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
switch (specMode){
case MeasureSpec.AT_MOST: //wrap_content
specSize = 200;
break;
case MeasureSpec.EXACTLY: //math_content 和 精确值
specSize = MeasureSpec.getSize(heightMeasureSpec);
break;
case MeasureSpec.UNSPECIFIED:
specSize = 400;
break;
}
mHeight = specSize;
/**
* 最后调用setMeasuredDimension进行赋值
*/
setMeasuredDimension(mWidth, mHeight);
}
可以看到这里我们给wrap_content赋值200,我们XML代码不变还是wrap_content,运行一下程序
可以看的出来大小确实变成了200,通过这个小例子就可以对View的测量有一个不错的认识了,并没有什么高深莫测的东西,一步一步来。
最后
爱生活,爱小丽,爱Android