Android中View的测量

##测量模式可分为以下三种

###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;
}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页