2012.06.28(2)——— android onMeasure和onLayout
参考:[url]http://blog.youkuaiyun.com/qinjuning/article/details/7110211[/url]
参考:[url]http://blog.youkuaiyun.com/qinjuning/article/details/7110211[/url]
1. onMeasure 我的大小
a. 属于View的方法,用来测量自己和内容的来确定宽度和高度
b. view的measure方法体中会调用onMeasure
c. MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST, 那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢。经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。而当设置为wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY
d. 在这个方法在必须调用setMeasureDimension 方法来告诉本View的Container类(各种Layout类型)所需占据的大小,如果没有设置setMeasureDimension ,Layout将会抛出异常。
e. 调用流程
e.1 设置本View视图的最终大小,该功能的实现通过调用setMeasuredDimension()方法去设置实际的高(对应属性: mMeasuredHeight)和宽(对应属性:mMeasureWidth)
e.2 如果本视图是个ViewGroup类型,则循环遍历子view的measure()方法
2、onLayout 我的位置
a. 属于ViewGroup的方法,用来为当前ViewGroup的子元素的位置和大小
b. View的layout方法体中会调用onLayout
c. 调用流程
c.1 设置该View视图位于父视图的坐标轴,即mLeft,mTop,mLeft,mBottom(调用setFrame()函数去实现)
c.2 如果该View是ViewGroup对象,需要实现onLayout方法,对每个子视图进行布局,调用该子视图的layout()方法去设置它的坐标值。