android view绘制流程之Measure

Android View的绘制流程分为Measure,Layout,Draw三步,本文讲第一步Measure,简称测量。

测量又可以分为测量流程和测量规则。

流 程:

android view绘制流程之Measure_第1张图片

废话少数,先上图。

此图是手绘的测量流程图

第一步:从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的大小。


你可能感兴趣的:(android)