理解MeasureSpec

MeasureSpec是View.java中的一个静态类:

public static class MeasureSpec {
    private static final int MODE_SHIFT = 30;
    private static final int MODE_MASK  = 0x3 << MODE_SHIFT;
    // 父容器对子View没有任何限制,子View可以为任何值。
    public static final int UNSPECIFIED = 0 << MODE_SHIFT;
    // 父容器指定了子View精确的大小
    public static final int EXACTLY     = 1 << MODE_SHIFT;
    // 父容器指定了子View的最大值
    public static final int AT_MOST     = 2 << MODE_SHIFT;
 
    public static int makeMeasureSpec(@IntRange(from = 0, to = (1 << MeasureSpec.MODE_SHIFT) - 1) int size, @MeasureSpecMode int mode) {
        if (sUseBrokenMakeMeasureSpec) {
            return size + mode;
        } else {
            return (size & ~MODE_MASK) | (mode & MODE_MASK);
        }
    }

    public static int getMode(int measureSpec) {
        return (measureSpec & MODE_MASK);
    }

    public static int getSize(int measureSpec) {
        return (measureSpec & ~MODE_MASK);
    }
}

UNSPECIFIED:表示父容器对于子View没有任何限制,子View可以为任何值。

EXACTLY:表示父容器制定了子View精确的大小。

AT_MOST:表示父容器指定了子View的最大值。

MeasureSpec是由一个int值表示的。其中,int值的最高2位表示SpecMode,其余30位表示SpecSize。

M_{1} M_{0} S_{29} S_{28} S_{27} \cdots S_{2} S_{1} S_{0} 为MeasureSpec所代表的int值,为总共32位,最高位是 M_{1} ,最低位是 S_{0}

其中,M_{1} M_{0} 表示SpecMode,S_{29} S_{28} S_{27} \cdots S_{2} S_{1} S_{0} 表示SpecSize。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值