Android View的绘制流程

来源:互联网 发布:高斯算法如何确定项数 编辑:程序博客网 时间:2024/06/15 13:47

首先,Android UI管理系统的层级关系为:activity{phoneWindow[decorView(titleview,contentview)]},phonewindow是activity中最基本的窗口系统,是activity和view交互的接口,decorview本质上是一个framelayout,包含了titleview和contentview

绘制首先是从根视图viewroot的performtraversals方法开始的,每个view负责绘制自身,viewgroup不光负责绘制自身,还需要负责通知自己的子view进行绘制。

绘制的过程分为三个步骤:测量measure、布局layout和绘制draw

测量模式measurespec有三种,分布是UNSPECIFIED不指定测量模式、EXACTILY精确测量模式和AT_MOST最大值模式,unspecified模式父视图没有限定子视图的大小,exactily模式当视图的layoutWidth或者layoutHeight指定为具体的数值时生效,表示父视图已经决定了子视图的精确大小,这时候view的测量值就是specsize的值,atmost模式当视图的layoutwidth或者layoutheight指定为wrapcontent时生效,此时子视图的尺寸可以是不超过父视图允许的最大尺寸的任意尺寸

对于decorview来说,它的measurespec由窗口尺寸和自身的layoutparams决定,对于普通的view来说,它的measurespec由父视图的measurespec和自身的layoutparams共同决定

measure:用来计算view的实际大小,测量流程从performMeasure开始,具体的测量操作分发给viewgroup,由viewgroup在它的measureChild方法中传递给子view,viewgroup遍历自身所有的子view,并逐个调用子view的measure方法实现测量操作。通过自定义view实现view或者viewgroup,重写onmeasure方法来实现测量,用setMeasureDimension方法设置view的测量宽高,如果自定义view没有重写onmeasure方法,则默认调用getDefaultsize方法来获得view的宽高

layout:用来确定view在父容器中的布局位置,是由父容器获取子view的位置参数后,调用子view的layout方法并将位置参数传递过去实现的。子类如果是viewgroup,则重写onlayout方法,实现viewgroup中所有的view控件的绘制流程

draw:用来将控件绘制出来,绘制基本上分为六个步骤:1、绘制view的背景drawBackground;2、如果需要的话,保存canvas图层;3、绘制view的内容;4、绘制view的子view,dispatchDraw;5、如果需要的话,绘制view的pading边缘并恢复图层;6、绘制view的装饰