View 的绘制

上面介绍了 View 树的创建过程,以及根 View 添加到 WindowManagerService 的过程,
下面我们再研究一下 View 树是怎么绘制出来的。

  1. 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

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/103436425