今天一个朋友问我MeasureSpec的具体含义,我解释说是位运算,并举例说明,记录如下,希望对大家有所帮助。
private static final int MODE_SHIFT = 30;
private static final int MODE_MASK = 0x3 << MODE_SHIFT;
public static final int UNSPECIFIED = 0 << MODE_SHIFT;
public static final int EXACTLY = 1 << MODE_SHIFT;
public static final int AT_MOST = 2 << MODE_SHIFT;
位运算
MODE_MASK :1100 0000 0000 0000
UNSPECIFIED:0000 0000 0000 0000
EXACTLY:0100 0000 0000 0000
AT_MOST:1000 0000 0000 0000
函数:
剩下就是位运算了。
比如:
我们设定 size 为 15px,那么 size 的二进制为 0000 0000 0000 1111
mode为 AT_MOST:1000 0000 0000 0000
makeMeasureSize(size,mode):结果为
0000 0000 0000 1111
+
1000 0000 0000 0000
=
measureSpace:1000 0000 0000 1111
getSize(measureSpace)
measureSpace:1000 0000 0000 1111
MODE_MASK :1100 0000 0000 0000
~MODE_MASK :0011 1111 1111 1111
1000 0000 0000 1111
&
0011 1111 1111 1111
=
0000 0000 0000 1111
即 size = 15
getMode(measureSpace)
measureSpace:1000 0000 0000 1111
MODE_MASK :1100 0000 0000 0000
1000 0000 0000 1111
&
1100 0000 0000 0000
=
1000 0000 0000 0000
即 2 << 30