自定义View中的onMeasure()方法
自定义View中的onMeasure()方法
在自定义 View 的时候,需要实现 onMeasure() 方法,去告诉系统这个自定义 View 的大小。
onMeasure() 方法如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
}
测量模式
通过 MeasureSpec 类解析 widthMeasureSpec
和 heightMeasureSpec
帮助测量 View。
MeasureSpec 是一个32位的 int 值,其中高2位为测量的模式,低30位为测量的大小。
测量模式可以分为以下三种
- EXACTLY
layout_width 或 layout_height 为具体数值,比如 android:layout_width="100dp",那么宽度的测量模式就是 EXACTLY。
还有,如果 layout_width 或 layout_height 为 match_parent 时,也是 EXACTLY 模式。
- AT_MOST
layout_width 或 layout_height 为 wrap_content 时
- UNSPECIFIED
想要多大就多大。
如何自定义测量值
首先,得到测量模式和测量值
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
当测量模式为 EXACTLY 时,直接使用 specSize 即可;
当测量模式为 AT_MOST 时,去除我们制定的大小与 specSize 中的最小是来作为最后的测量值;
当测量模式为 UNSPECIFIED 时,直接使用我们制定的大小。
private int measureWidth(int measureSpec) {
int result;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = 200;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}
如果不重写 onMeasure 方法
如果在自定义控件的时候,不重写 onMeasure 方法的话,就只能使用 EXACTLY,也就是 layout_width 和 layout_height 只能使用具体数值或者 match_parent。
注意
测量完 View 的大小之后,别忘了调用
setMeasureDimension();