Android View MeasureSpec詳解

1.MeasureSpc類說明

1.1 SDK 說明如下

   A MeasureSpec encapsulates the layout requirements passed from parent to child. Each MeasureSpec represents a requirement for either the width or the height. A MeasureSpec is comprised of a size and a mode. 

   即:MeasureSpc類封裝了父View傳遞給子View的佈局(layout)要求。每個MeasureSpc實例代表寬度或者高度(只能是其一)要求。 

簡單理解爲一個32位的數字,其中前2位和後30位分別代表SpecMode和SpecSize



它有三種模式(SpecMode):

    ①最高兩位是00的時候表示"未指定模式",即MeasureSpec.UNSPECIFIED。父元素部隊自元素施加任何束縛,子元素可以得到任意想要的大小;一般用於系統內部,表示一種測量的狀態。

    ②最高兩位是01的時候表示"'精確模式",即MeasureSpec.EXACTLY。父元素已經檢測出該元素的確切大小,View的最終大小就是SpecSize所對應的值;對應LayoutParams中的match_parent和具體數值兩種模式。

    ③最高兩位是11的時候表示"最大模式",即MeasureSpec.AT_MOST。父容器指定了一個可用大小即SpecSize,View的大小不能大於這個值;對應LayoutParams中的Wrap_content

  常用的三個函數:

  static int getMode(int measureSpec)  :  根據提供的測量值(格式)提取模式(上述三個模式之一)

  static int getSize(int measureSpec)  : 根據提供的測量值(格式)提取大小值(這個大小也就是我們通常所說的大小)

  static int makeMeasureSpec(int size,int mode)  :  根據提供的大小值和模式創建一個測量值(格式)

1.2 MeasureSpc類源碼分析 

public class View implements ... {
	 ...
	 public static class MeasureSpec {
        private static final int MODE_SHIFT = 30; //移位位數爲30
        //int類型佔32位,向右移位30位,該屬性表示掩碼值,用來與size和mode進行"&"運算,獲取對應值。
        private static final int MODE_MASK  = 0x3 << MODE_SHIFT;

        //向右移位30位,其值爲00 + (30位0)  , 即 0x0000(16進製表示)
        public static final int UNSPECIFIED = 0 << MODE_SHIFT;
        //向右移位30位,其值爲01 + (30位0)  , 即0x1000(16進製表示)
        public static final int EXACTLY     = 1 << MODE_SHIFT;
        //向右移位30位,其值爲02 + (30位0)  , 即0x2000(16進製表示)
        public static final int AT_MOST     = 2 << MODE_SHIFT;

        //創建一個整形值,其高兩位代表mode類型,其餘30位代表長或寬的實際值。可以是WRAP_CONTENT、MATCH_PARENT或具體大小exactly size
        public static int makeMeasureSpec(int size, int mode) {
            return size + mode;
        }
        //獲取模式  ,與運算
        public static int getMode(int measureSpec) {
            return (measureSpec & MODE_MASK);
        }
        //獲取長或寬的實際值 ,與運算
        public static int getSize(int measureSpec) {
            return (measureSpec & ~MODE_MASK);
        }

    }
	...
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章