MeasureSpecストレージ情報

5093 ワード

MeasureSpecストレージ情報

  • MeasureSpecストレージ情報
  • 1. 変数および10進数対応表
  • 2. ソース分析
  • 2.1 makeMeasureSpecメソッド
  • 2.2 getSizeとgetMode


  • 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)が得られます.