上面介绍了 View 树的创建过程,以及根 View 添加到 WindowManagerService 的过程,
下面我们再研究一下 View 树是怎么绘制出来的。
- View 绘制流程
上面介绍根 View 的创建流程时提到 ViewRootImpl 创建完后在 setView 里调用了一次
requestLayout()请求第一次刷新,requestLayout()的实现如下面:
requestLayout()里面调用了一次 scheduleTraversals()进行界面刷新,实际上 View 树的每
次 刷 新 都 是 通 过 调 用 scheduleTraversals() 开 始 的 , scheduleTraversals() 内 部 是 通 过
Choreographer.postCallback 模式进行界面刷新的,默认是使用 VSYNC 机制的,这样可以提
高界面显示的流畅性。下面是 scheduleTraversals()的内部实现:
13
从代码可以得知最终会执行 performTraversals,这个函数是 View 在画布上绘制内容的
私有入口之一,该函数是 private 类型的,后面会详细讲解该函数。
Choreographer 是基于 VSNC 实现的一个控制类,VSNC 的主要原理是每隔一个固定的
时间(一般为 16ms)设置一个高优先级中断,在中断的时候处理各种有序任务,这样所有
的任务就可以按照固定的频率进行处理。VSNC 可以用来进行控制界面刷新、动画、输入事
件处理,使用 VSNC 可以使界面显示更加平滑、流畅。
Choreographer 通过提供 postCallback、postCallbackDelayed、postFrameCallback 或者
postFrameCallbackDelayed 接口最终都会通过 postCallbackDelayedInternal 将一个 Runnable 或
者一个 FrameCallback 添加到有序任务队列里,并通过 scheduleFrameLocked 或者消息机制
调用 scheduleV