Android中View的测量

本文深入解析了Android布局中的三种测量模式:EXACTLY、AT_MOST和UNSPECIFIED,阐述了它们在不同场景下的应用,以及如何通过重写onMeasure()方法使自定义View支持wrap_content属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测量模式可分为以下三种

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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值