测量模式可分为以下三种
1.EXACTLY:
即精确值模式,当我们将空间的width或height制定为具体值 ,或者为match_parent时,此时将占据父容器的大小,使用的就是EXACTLY。
2.AT_MOST
最大值模式,当空间的宽高属性制动为自适应wrap_content时,控件大小一般随着空间的子空间或内容的变化而发生改变,此时View的尺寸只要不超过父控件允许的最大尺寸即可。
3.UNSPECIFIED
此属性不指定大小测量模式,View像多大就多大,通常自定义一些特殊View的时候可以用到。
Attention注意:
-
EXACTLY是onMeasure()方法中默认的,因此自定义View的时候,如果不重写该方法,默认使用的是EXACTLY。
-
如果要让自定义View支持wrap_content属性,那就必须重写onMeasure()方法来指定当宽或高指定为wrap_content时候的大小
··· /**
* 测量宽
* @param measureSpec
* @return
*/
private int measureWidth(int measureSpec)
{
int result = 0;
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;
}
/**
* 测量宽
* @param measureSpec
* @return
*/
private int measureHeigth(int measureSpec)
{
int result = 0;
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;
}