首先 onMeasure方法是为了得到各个View大小的函数
fill_parent-->public static final int EXACTLY = 1 << MODE_SHIFT;
wrap_content-->public static final int AT_MOST = 2 << MODE_SHIFT;
我想应该是在解析XML的时候 FILL_PARENT=-(-1)>>30 WRAP_CONTENT=-(-2>>30) 猜测。。没找到证据。。。有谁能找到根我说句。。
通过上面的code就可以得到对应的 onMeasuere(int Widthspec,int HeighSpec)中对应的大小
比如我定义一个xml
android:layout_width="200px"
android:layout_height="500px"
对应的到的widhthSpec为EXACTLY +200;对应的HeightSpec为EXACTLY +500;
如果android:layout_width="wrap_content"-->widhtSpec=AT_MOST
android:layout_height="fill_parent"-->HeightSpec=EXACTLY
因为都会调用makeMeasureSpec来确定大小。比如在ViewGroup中的源码返回的
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
//这段代码太有才了。
public static int getSize(int measureSpec) {
return (measureSpec & ~MODE_MASK);
}
举个例子:
11&~10=1
2&~10=2
意思就是超过10的部分就用超过的部分比如11-10=1
没超过10的就用本事。比如2
这样的话,就可以用android:layout_width="200px" 和fill_parent等属性。