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的大小。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值