android view绘制流程之Measure
Android View的绘制流程分为Measure,Layout,Draw三步,本文讲第一步Measure,简称测量。
测量又可以分为测量流程和测量规则。
流 程:
废话少数,先上图。
此图是手绘的测量流程图
第一步:从LinearLayout1的onMeasure()方法开始
第二步:LinearLayout1遍历其所有子View,并调用子View的measure()方法对子View进行测量。
第三步:View的所有子类,包括ViewGounp都没有实现measure()方法,而只有View类自身实现了该方法,所有measure()方法都会走到View.measure()里面去。
第四步:在View.measure()方法里面循环调用所有子View,在这里就是Text1和LinearLayout2,的onMeasure()方法。
第五步:根据布局位置关键依次执行子View的onMeasure()方法。在这里我们先计算TextView1的大小,在执行完TextView1的onMeasure()方法后将计算出来的值保存起来,该条分支结束。
第六步:执行LinearLayout2的onMeasure()方法,由于LinearLayout2也是ViewGrounp,所以也要先计算其子View的大小。
第七步:依次调用TextView2和TextView3的measure()方法,在measure()里面再调用TextView2和TextView3的onMeasure()方法计算他们的大小并保存。
第八步:根据TextView2和TextView3的的大小计算LinearLayout2的大小并保存。
第九步:根据LinearLayout2和Text1的大小计算LinearLayout1的大小。
第十步:Measure结束。
测量的流程是由顶层View发起【onMeasure()方法】,但最先测量的是所有底层View,也就是叶子节点,然后根据子View测量父View,直到顶层View。
规 则:
在我们的布局文件里面都会有layout_width和layout_height两个参数,这是父View传递给子View的测量空间,他们有三种选项;
1. match_parent : 不用计算,直接采用父View的大小
2. wrap_content : 需要计算,根据子View或者内容计算
3. 确定值 : 不用计算,直接采用确定值,但需要和父View比较,如果比父View还大,就采用父View的值
注意:
顶层View的layout_width和layout_height就是屏幕的宽度和高度,这也是计算View树的依据。
当父View的layout_width是wrap_content,而子View是match_parent的时候,也就是父亲依赖儿子,儿子又依赖父亲的情况。系统会按照wrap_content计算子View的大小。