自定义View之 onMeasure() view的高度自适应wrap_content view的测量

2016-12-12 14:17:44来源:网络收集作者:程序猿人点击

读群英传有感,笔记之。。。。。。


在很多自定义view之后,控件的高度需要自适应,即使使用wrap_content没有作用还是match_parent的效果,这时就需要重写onMeasure()方法来实现,view类的onMeasure()方法默认是只支持.EXACTLY模式,所以在自定义view先支持wrap_content就得重写onMeasure(),在这里就需要说一下测量的三种模式了:


第一种:


EXACTCLY


大概意思就是精确值模式,我们在布局文件中的宽和高为具体值,或为match_parent(父布局的大小)属性时系统会用次模式,


第二种:


AT_MOST


大概意思就是最大值模式,我理解为就是自适应。我们在布局文件中的宽和高为wrap_content 属性时,控件的大小一般会随着子View大小大或内容的多少的变化而变化,此控件只要不超过父控件的大小就行。


第三种:


UNSPECIFIED


这种模式不指定测量模式,view大小没有限制,想多大就多大。


我们可以通过MeasureSpec这个类的getMode()和getSize()方法获取测量模式和大小,


代码如下:


没什么逻辑,仔细看一下就ok了


/**
* view的大小控制
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}
private int measureHeight(int measureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = (int) getWidth();
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
private int measureWidth(int measureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = 75;//根据自己的需要更改
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}

哪有不足之处请大家指出,共同进步。。。。

微信扫一扫

第七城市微信公众平台