我们自定义控件的时候,除了需要复写onDraw()方法实现我们view的视图外,有时候还需要复写onMeasure()来进行对自定义控件的大小进行精确的计算,以便自定义控件能更好的显示其内容。
onMeasure(int widthMeasureSpec, int heightMeasureSpec)中的参数,是父控件传进来的对子控件大小进行说明和限制的信息,包含了size(大小)和mode(模式)的两个信息。google工程师为了不另外开辟对象空间来存储这两个信息,于是android提供了MeasureSpec这个类来打包size(大小)和mode(模式)为int值,并提供了解包的方法供提取出size(大小)和mode(模式)这两个信息。
API17以及之前,这个类提供的打包方法非常简单,但是存在bug。之后的版本已经修复了这个问题。(看代码,你能发现这个bug么)
/
* @param size the size of the measure specification
* @param mode the mode of the measure specification
* @return the measure specification based on size and mode
*/
public static int makeMeasureSpec(int size, int mode) {
return size + mode;
}
很容易看出这方法的参数 ,如果对换位置并不影响返回的结果。并且如果传入的其中一个值溢出,会导致测量结果的不准确。RelativeLayout就受到这