理解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。

 

 

 

 

你可能感兴趣的:(Android,Android日记)