view详解(二) view的绘制流程

来源:互联网 发布:阿里云的黑洞模式 编辑:程序博客网 时间:2024/05/28 06:08

1.ViewRoot

1.1 ViewRoot 是GUI系统管理与GUI系统呈现之间的桥梁,它并不是一个view类型,而是继承与Handler,主要作用:

    1.1.1:向DecorView分发收到的用户发起的event事件,如按键,触屏,轨迹球等事件

    1.1.2:与windowManagerSerVice交互,完成整个Activity的GUI的绘制

    1.1.3:Activity,PhoneWindow,ViewRoot对应关系为:一个Activity对应一个PhoneWindow,在DecorView就包含在PhoneWindow,而ViewRoot是链接PhoneWindow与windowManageService的桥梁。

2.mesarue()过程

主要作用:为整个view树计算实际的大小,

步骤

1.通过setMeasuredDimension()方法去设置本实际的高和宽

2.如果该view对象是个viewgroup类型,需要重写该onMeasure()方法,对其子视图进行遍历的measure()过程。对于每个子视图的measure()过程,是通过调用父类的measureChildWithMargins()方法去实现的

如下图


3.layout布局过程

主要作用:根据子视图的大小以及布局参数,将view放到合适的位置

步骤

1.layout方法会设置该view视图位于父视图的坐标轴,即left,top,right,bottom(调用setFrame()函数去实现),接下来回掉onLayout方法

2.如果view为viewgroup类型,需要遍历每个子视图childView。调用该子视图的layout方法去设置他的坐标值。


4.draw绘图过程

由viewRoot对象的performTraversals()方法调用draw()方法发起的绘制该view树,(每次发起绘图时,并不会重新绘制每个view树的视图,而只会重新绘制那些需要重绘的视图,更具每个view内部的DRAWN变量来判断

步骤

1.绘制该view的背景

2.调用onDraw方法绘制视图本身,(每个view都需要重载该方法,viewGroup不需要实现该方法

3.调用dispatchDraw方法绘制子视图(只有viewgroup需要实现该方法),dispatchDraw()内部是调用drawChild()去重新回调每个子视图的draw方法


0 0