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高级进阶