自定义View中的onMeasure()方法

自定义View中的onMeasure()方法

在自定义 View 的时候,需要实现 onMeasure() 方法,去告诉系统这个自定义 View 的大小。

onMeasure() 方法如下:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
}

测量模式

通过 MeasureSpec 类解析 widthMeasureSpecheightMeasureSpec 帮助测量 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();
原文地址:https://www.cnblogs.com/okadanana/p/5866770.html