view的绘制流程

1、绘制的整体流程

当一个应用启动时,会启动一个主activity,Android系统会根据Activity的布局来对它进行绘制。绘制会从跟视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,ViewGroup还要负责通知自己的子View进行绘制操作。

performTraversals方法的核心代码:1、performMeasure方法;2、performLayout方法;3、performDraw方法。

2、MeasureSpec,表示的是一个32位的整型值,高2位表示测量模式SpecMode,低30位表示测量模式下的规格大小SpecSize。MeasureSpec是View的静态内部类,说明该如何测量这个View。

SpecMode有三种测量模式:

unspecified:不指定测量模式,父视图没有限制子视图的大小,子视图可以是想要的任何尺寸。通常用在系统内部,开发中很少使用;exactly:精确测量模式,当该视图的layout_width后者layout_height指定为具体数值或者match_parent时生效,表示父视图决定了子视图的精确大小,这种模式下View的测量值就是SpecSize的值;at_most:最大值测量模式,当该视图的layout_width或者layout_height指定为wrap_content时生效,此时子视图的尺寸可以是不超过父视图允许的最大尺寸的任何尺寸。

3、Measure:页面的测量流程从performMeasure开始,分发给viewgroup,由viewgroup在它的measureChild方法中传递给子view,通过遍历自身的所有子view,并逐个调用子view的measure方法实现测量。

如果需要自定义测量过程,则子类可以重写onMeasure方法。setMeasureDimension方法用于设置View的测量宽高,如果view没有重写onMeasure方法,则会默认调用getDefaultSize来获取view的宽高。

4、Layout:layout过程用来确定View在父容器中的布局位置,它是由父容器获取子View的位置参数后,调用子View的layout方法并将位置参数传入实现的。子类如果是ViewGroup类型,则重写onLayout方法,实现ViewGroup中所有View控件的布局流程。

5、Draw:绘制的流程从performDraw方法开始,最后会调用drawSoftware方法,最终调用每个View的draw方法绘制具体的View。绘制基本上分为六个部分:绘制背景、保存图层、绘制内存、绘制View的子view,绘制View的fading边缘并恢复图层、绘制View的装饰(例如滚动条)等。

参考书:Android高级进阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值