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);
}
}
...
}