View的测量宽高和最终宽高有什么区别?

  • 背景
  • 书中原文
    • A little bit of progress every dayCome on

背景

工作中要实现某个功能,然后需要用到android中的自定义view的知识,然后边实践边学习。在看《Android开发艺术探索》一书里所写关于自定义view的内容时,有个问题解释的很有必要且很清楚。

书中原文

这个问题可以具体为:View的getMeasuredWidth和getWidth这两个方法有什么区别,至于getMeasuredHeight和getHeight的区别和前两者完全一样,为了回答这个问题,首先,我们看一下getWidth和getHeight这两个方法的具体实现:

// 获取最终宽度
public final int getWidth(){
    return mRight - mLeft;
}

// 获取最终高度
public final int getHeight(){
    return mBottom - mTop;
}

从getWidth和getHeight的源码再结合mLeft、mRight、mTop和mBottom这四个变量的赋值过程来看,getWidth方法的返回值刚好就是View的测量宽度,而getHeight方法的返回值也刚好就是View的测量高度。经过上述分析,现在我们可以回答这个问题了:iew的默认实现中,View的测量宽/高和最终宽/高是相等的,只不过测量宽/高形成于View的measure过程,而最终宽/高形成于View的layout过程,两者的赋值时机不同,测量宽/高的赋值时机稍微早了一些。因此,在日常开发中,我们可以认为View的测量宽/高就等于最终宽/高,但是的确存在某些特殊情况会导致两者不一致,下面举例说明。

  • 如果重写View的layout方法,代码如下:
public void layout(int l, int t, int r, int b){
    super.layout(l, t, r + 100, b + 100);
}
上述代码会导致在任何情况下View的最终宽/高总是比测量宽/高大100px,虽然这样做会导致View显示不正常并且也没有实际意义,但是这证明了测量宽/高的确可以不等于最终宽/高。另外一种情况是在某些情况下,View需要多次measure才能确定自己的测量宽/高,在前几次的测量过程中,其得出的测量宽/高有可能和最终宽/高不一致,但最终来说,测量宽/高和最终宽/高相同。

================================================================

A little bit of progress every day!Come on!

你可能感兴趣的:(技术分享类)