关于定义布局OnMeasure 的总结

来源:互联网 发布:欢乐动漫 知乎 编辑:程序博客网 时间:2024/06/18 18:05
                                                                                      measure过程分析

因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌ViewViewGroup形成一个View树。所以measure函数的作用是为整个View树计算实际的大小,设置每个View对象的布局大小(“窗口”大小)。实际对应属性就是View中的mMeasuredHeight(高)和mMeasureWidth(宽)。

View类中measure过程主要涉及三个函数,函数原型分别为

public final void measure(int widthMeasureSpec, int heightMeasureSpec)

protected final void setMeasuredDimension(int measuredWidth, int measuredHeight)

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

前面两个函数都是final类型的,不能重载,为此在ViewGroup派生的非抽象类中我们必须重载onMeasure函数,实现measure的原理是:假如View还有子View,则measureView,直到所有的子View完成measure操作之后,再measure自己。ViewGroup中提供的measureChildmeasureChildWithMargins就是实现这个功能的。 自定义控件的时候经常会重写OnMeasure方法,测量之类,给容器限制大小范围,记录下设置的宽高大小 。接下来 先看下源码




 1.     首先 覆写OnMeasure 方法,当你的类是继承ViewGrounp的时候,必要的时候要要测量下子View ,继承View 如果包含你自定义View是线性布局就测量一次,
如果父布局是相对布局就要测量两次 执行两次OnMeasure 

   

















 2. 接下来调用 SetMeasuredDimension设置测量最后的宽高大小
































3.设置宽高的参数 里面的getDefaultSize方法的参数值,第一个是有背景图片时的宽高,第二个是父类传进来子View需要多大的大小


































4.如果测量子View的时候调用 measureChildren会遍历自己的所以子View,然后View.measure,最后调用View类里的Measure方法,接着跳到OnMeasure方法。























0 0
原创粉丝点击