开发 android 应用的时候,常有一些问题会涉及到 “硬件加速” ,例如在某个页面上打开/关闭硬件加速来解决特定问题。那么今天就简单说下具体 硬件绘制 相关的一些内容。
应用里的页面是以一棵棵 View 树表示的,其中每个 view 代表屏幕上一块内容。而实际显示的内容便是 view 绘制出来的,view 的绘制是从 view 树的逻辑控制者——也就是对应的 ViewRootImpl 对象触发的。其中包括软件绘制和硬件绘制两种方式。
当 ViewRootImpl 设置了 开启硬件加速 的时候,会使用硬件绘制的方式进行绘制,否则使用软件绘制。硬件绘制和软件绘制类似于对同一个接口的两种实现。其基本的绘制步骤都一样的,只是两种绘制方式里每个步骤实现不同。
View 的软件绘制和硬件绘制的核心是 draw,也就是通常所说的 measure-layout-draw 中的 draw ,也就是绘制流程。即遍历 view 树,自上向下遍历依次调用 draw。其中会涉及 view 的绘制过程以及向下分发等。
在此 draw 的流程之前以及之后,需要进行一些处理。大家都知道 draw 是依赖于画布 canvas 的,canvas 只有在获取之后才可以进行 draw,并且 draw 完成后需要将 canvas 交给实际绘制到屏幕上的下一个环节。