MeasureSpecストレージ情報
5093 ワード
MeasureSpecストレージ情報
1.変数および10進数対応表
変数名
10進法
2進法
MASK
-1073741824
11000000 00000000 00000000 00000000
~MODE_MASK
1073741823
00111111 11111111 11111111 11111111
at_most
-2147483648
10000000 00000000 00000000 00000000
200
200
00000000 00000000 00000000 11001000
2.ソース分析
2.1 makeMeasureSpecメソッド
public static int makeMeasureSpec(int size, int mode) {
if (sUseBrokenMakeMeasureSpec) {
return size + mode;
} else {
return (size & ~MODE_MASK) | (mode & MODE_MASK);
}
}
(size&~MODE_MASK)の意味size=200 pxなら200&~MODE_MASK
00111111 11111111 11111111 11111111
&
00000000 00000000 00000000 11001000
=
00000000 00000000 00000000 11001000
mode&MODE_を見てMASK:mode=atMost
10000000 00000000 00000000 00000000
&
11000000 00000000 00000000 00000000
=
10000000 00000000 00000000 00000000
さいけつごう
00000000 00000000 00000000 11001000
|
10000000 00000000 00000000 00000000
=
10000000 00000000 00000000 11001000
分析:実は高2達でmodeを保存して、残りの32位でsizeを保存して、どうしてですか?modeは3種類しかないので、2つで4種類貯めることができるので、上位2位のmodeを選びました.&その後、その値を指定して席に着きます.そうやってあと何種類もmode泣いてしまう
2.2 getSizeとgetMode
public static int getMode(int measureSpec) {
return (measureSpec & MODE_MASK);
}
public static int getSize(int measureSpec) {
return (measureSpec & ~MODE_MASK);
}
10,000,000,000,000,000,000,000,000,100,000
getMode:
10000000 00000000 00000000 11001000
&
11000000 00000000 00000000 00000000
=
10000000 00000000 00000000 00000000
つまり2桁だけ高く、2桁高いのは1が1で、1が0ではなく、後ろの30桁が直接消去されます.
10000000 00000000 00000000 00000000
この値がat_most getSize:
10000000 00000000 00000000 11001000
&
00111111 11111111 11111111 11111111
=
00000000 00000000 00000000 11001000
解析:高2ビットは直接消去するので、幅を負にすることは不可能です.低30ビットは1が1で、1が0で、11001000(10進数の200)が得られます.