在Android 自定义view方法中onMeasure()
用于绘测自身的view大小,我们也可通过复写计算出view的内容的起止位置,也可将自身的大小通过setMeasuredDimension(int,int)
将自身大小传递给父view。
需要注意两点
- 1,一般情况重写onMeasure()方法作用是为了自定义View尺寸的规则,如果你的自定义View的尺寸是根据父控件行为一致,就不需要重写onMeasure()方法。
-
2,如果不重写onMeasure方法,那么自定义view的尺寸默认就和父控件一样大小,当然也可以在布局文件里面写死宽高,而重写该方法可以根据自己的需求设置自定义view大小。
常见的使用示例如下:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取建议的最小高度 final int minimumHeight = getSuggestedMinimumHeight(); //获取建议的最小宽度 final int minimumWidth = getSuggestedMinimumWidth(); int width = measureWidth(minimumWidth, widthMeasureSpec); int height = measureHeight(minimumHeight, heightMeasureSpec); //设置测量的尺寸,用于父布局进行view排列 setMeasuredDimension(width, height); } private int measureWidth(int defaultWidth, int measureSpec) { //获取测量的模式 int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.AT_MOST://wrap_content defaultWidth = /*内容视图大小+*/defaultWidth + getPaddingRight() + getPaddingLeft(); break; case MeasureSpec.EXACTLY://固定值,match_parent defaultWidth = specSize; break; case MeasureSpec.UNSPECIFIED://0dp,空值 defaultWidth = Math.max(defaultWidth, specSize); } return defaultWidth; } private int measureHeight(int defaultHeight, int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.AT_MOST://wrap_content defaultHeight = /*内容视图大小+*/defaultHeight + getPaddingTop() + getPaddingBottom(); break; case MeasureSpec.EXACTLY: defaultHeight = specSize; break; case MeasureSpec.UNSPECIFIED://0dp,空值 defaultHeight = Math.max(defaultHeight, specSize); break; } return defaultHeight; }