Android View 树的绘制流程

时间:2024-05-22 15:26:04

要了解并掌握 View 的工作原理,先从 Activity 的组成结构说起。

Android View 树的绘制流程

上图可以这样理解:
1、Activity 类似于一个框架,负责容器生命周期及活动,窗口通过 Window 来管理;
2、 Window 负责窗口管理(实际是子类 PhoneWindow),窗口的绘制和渲染交给 DecorView完成;
3、DecorView 是 View 树的根,开发人员为 Activity 定义的 layout 将成为 DecorView 的子视图 ContentParent 的子视图; 

PhoneWindow 类还关联了一个名为 mWindowManager 的 WindowManager对象,WindowManager 会创建一个 ViewRootImpl 对象来和 WindowManagerService 进行沟通,WindowManagerService 能获取触摸事件、键盘事件或轨迹球事件,并通过 ViewRootImpl 将事件分发给各个 Actitivty;另外,ViewRootImpl 还负责 Activity 整个 GUI 的绘制。

Android View 树的绘制流程

ViewRootImpl 负责整个activity GUI绘制,而绘制是从ViewRootImpl 的 PerformTranservals() 开始,而该方法主要涉及三个方法,也是绘制的三步骤:
performMeasure()    performLayout()         performDraw()

performMeasure()方法测量组件的大小,
performLayout()方法用于子组件的定位(放在窗口的什么地方),
而 performDraw()方法自然就是将组件的外观绘制出来了


View 类的 draw()方法是组件绘制的核心方法,主要做了下面几件事:
1、制背景:background.draw(canvas)
2、绘制自己:onDraw(canvas)
3、绘制子视图:dispatchDraw(canvas)
4、绘制滚动条:onDrawScrollBars(canvas)

小结
组件的绘制也是一个递归的过程,说到底 Activity 的 UI 界面的根一定是容器,根容器绘制结束后开始绘制子组件,子组件如果是容器继续往下递归绘制,否则将子组件绘制出来……直到所有的组件正确绘制为止。总体来说,UI 界面的绘制从开始到结束要经历几个过程:
1、测量大小,回调 onMeasure()方法
2、组件定位,回调 onLayout()方法
3、组件绘制,回调 onDraw()方法