一、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 ...