View的测量宽高和最终宽高有什么区别?
2017-12-14 23:34
399 查看
背景
书中原文
A little bit of progress every dayCome on
从getWidth和getHeight的源码再结合mLeft、mRight、mTop和mBottom这四个变量的赋值过程来看,getWidth方法的返回值刚好就是View的测量宽度,而getHeight方法的返回值也刚好就是View的测量高度。经过上述分析,现在我们可以回答这个问题了:iew的默认实现中,View的测量宽/高和最终宽/高是相等的,只不过测量宽/高形成于View的measure过程,而最终宽/高形成于View的layout过程,两者的赋值时机不同,测量宽/高的赋值时机稍微早了一些。因此,在日常开发中,我们可以认为View的测量宽/高就等于最终宽/高,但是的确存在某些特殊情况会导致两者不一致,下面举例说明。
如果重写View的layout方法,代码如下:
================================================================
书中原文
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!
相关文章推荐
- 四 View 的测量宽高和最终宽高的区别
- 获取View宽高的几种方式及View和ViewGroup测量的简单实现
- MVVM模式中ViewModel和View、Model有什么区别?
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?
- 获取View宽高的几种方式及View和ViewGroup测量的简单实现
- View中的draw和onDraw有什么区别
- js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别
- Android开发中的View类的视图属性focusableInTouchMode这个属性跟focusable有什么区别?
- set_dft_signal -view的参数existing_dft和spec有什么区别
- 获取View宽高的几种方式及View和ViewGroup测量的简单实现
- Android-View宽高测量研究
- TcxGrid的TcxGridDBTableView.ViewData.Rows跟Records有什么区别
- 获取View宽高的几种方式及View和ViewGroup测量的简单实现
- view.inflater和inflater.inflater有什么区别
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?
- 获取View宽高的几种方式及View和ViewGroup测量的简单实现
- ViewController里的loadView和viewDidLoad什么区别
- Android——View宽高的设置和多种获取宽高的方法、layout_grivaty与grivaty的区别
- View的getWidth()和getMeasuredWidth()有什么区别吗?如何在onCreate中拿到View的宽度和高度?