大家都知道,在View的Measure里会用到一个叫MeasureSpec这个类,为什么要用它呢?
android里的布局不像ios,它可以用描述来形容这个布局,不用写死它的宽高,因为android的手机分辨率太多了,所以简单的设置某一个view的宽高,不能很好的适配。
所以android引出了布局描述:wrap_content,match_parent,fill_parent,这些布局描述会在xml里写好,那么在java里头,是怎么读取这些描述,然后用什么去表示它们呢?
android java层,用了两个变量来承载这些信息:mode和size。
mode有三种类型:EXACTLY,AT_MOST,UNSPECIFIED
size就是大小了,没什么说的
到这以后,MeasureSpec就来了,它把mode和size巧妙的结合在一起。而且生成的一个int数,高32-31位来装mode,30-0位来装size
10000000000000000000000000000000 AT_MOST
00000000000000000000000000000000 UNSPECIFIED
01000000000000000000000000000000 EXACTLY
private static final int MODE_SHIFT = 30;
private static final int MODE_MASK = 0x3 << MODE_SHIFT;
MeasureSpec通过getMode取mode,通过getSize取size
public static int getMode(int measureSpec) {
return (measureSpec & MODE_MASK);//<span style="font-family: Arial, Helvetica, sans-serif;">这里面的modemask就是:</span><span style="font-family: Arial, Helvetica, sans-serif;">11000000000000000000000000000000</span><p>它用modemask&xx就能得到mode</p>
}
<span style="font-family: Arial, Helvetica, sans-serif;"> public static int getSize(int measureSpec) {</span>
return (measureSpec & ~MODE_MASK);//00111111111111111111111111111111~MODE_MASK:
}
通过makeMeasureSpec把mode和size相加,得出一个size与mode的结合体
public static int makeMeasureSpec(int size, int mode) {
return size + mode;
}
至于为什么要把它们两合成一个int值,我觉得应该是省内存,或是android原本的设想是没有mode,后来为了加上mode但又不想影响原有参数,就把这两合起来当成int了。