一、MeasureSpc类说明
 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求。每个MeasureSpc实例代表宽度或者高度

它有三种模式:
①、UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
②、EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
③、AT_MOST(至多),子元素至多达到指定大小的值。

常用的三个函数:
static int getMode(int measureSpec) : 根据提供的测量值(格式),提取模式(上述三个模式之一)
static int getSize(int measureSpec) : 根据提供的测量值(格式),提取大小值(这个大小也就是我们通常所说的大小)
static int makeMeasureSpec(int size,int mode) : 根据提供的大小值和模式,创建一个测量值(格式)

MeasureSpc类源码分析 其为View.java类的内部类,路径:frameworksbasecorejavaandroidviewView.java

 1 public class View implements ... {
 2 ...
 3 public static class MeasureSpec {
 4 private static final int MODE_SHIFT = 30; //移位位数为30
 5 //int类型占32位,向右移位30位,该属性表示掩码值,用来与size和mode进行"&"运算,获取对应值。
 6 private static final int MODE_MASK = 0x3 << MODE_SHIFT;
 7  //向右移位30位,其值为00 + (30位0)  , 即 0x0000(16进制表示)  
 8     public static final int UNSPECIFIED = 0 << MODE_SHIFT;  
 9     //向右移位30位,其值为01 + (30位0)  , 即0x1000(16进制表示)  
10     public static final int EXACTLY     = 1 << MODE_SHIFT;  
11     //向右移位30位,其值为02 + (30位0)  , 即0x2000(16进制表示)  
12     public static final int AT_MOST     = 2 << MODE_SHIFT;  
13 
14     //创建一个整形值,其高两位代表mode类型,其余30位代表长或宽的实际值。可以是WRAP_CONTENT、MATCH_PARENT或具体大小exactly size  
15     public static int makeMeasureSpec(int size, int mode) {  
16         return size + mode;  
17     }  
18     //获取模式  ,与运算  
19     public static int getMode(int measureSpec) {  
20         return (measureSpec & MODE_MASK);  
21     }  
22     //获取长或宽的实际值 ,与运算  
23     public static int getSize(int measureSpec) {  
24         return (measureSpec & ~MODE_MASK);  
25     }  
26 
27 }  
28 ...  
View Code

相关文章: