网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

别只会用 drawCircle 了?Android Canvas 底层机制你懂多少?

GG网络技术分享 2026-04-17 12:48 0


别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制

哎, 说实话,每次看到别人在 Android 上画一些炫酷的动画、复杂的图形,我心里都挺不是滋味的。我呢?只会个 drawCircle… 唉,感觉自己像个画画小白! YYDS... 今天就鼓起勇气,硬着头皮去扒一扒 Android Canvas 的底层机制。说实话,刚开始看的时候,感觉就像在读天书… 不过坚持下来好像也没那么难了。

Canvas 是什么?为啥重要?

先说概念吧

Canvas 简单 就是一块“画布”,你可以在上面画各种东西。但是!千万不要把它想象成一个像素数组! 优化一下。 它可不是那种直接操作像素的家伙。它更像是一个“指令发射器”,把你的绘图指令翻译成一系列的底层操作。

为啥重要呢?

主要原因是所有你在 Android 屏幕上看到的自定义 UI、 游戏画面、甚至是简单的动画效果,都离不开 Canvas。如果你想做出流畅、高性能的应用,就必须了解 Canvas 的工作原理,操作一波。。

Android 渲染流程:Canvas 在哪一层?

Android 的渲染流程可复杂了!六层架构啊!从上到下分别是:

  • Application
  • WindowManager
  • WindowService
  • WindowManagerService
  • SurfaceFlinger
  • Hardware Composer

Canvas 就在 Application 层,负责生成显示的内容。然后这些内容会通过 WindowManager 等一系列组件传递到 SurfaceFlinger 进行合成和显示。想想都觉得累…,我们都经历过...

invalidate 的旅程:从代码到屏幕

触发重绘

触发一系列的操作:

VSYNC 同步

先说说是 VSYNC信号。这个信号会定期地通知系统可以开始绘制新的帧。VSYNC 很重要哦!主要原因是它能保证你的绘制过程和屏幕的刷新频率同步,避免撕裂现象,拯救一下。。

双缓冲机制

特征硬件加速软件渲染
渲染线程异步 RenderThread同步 CPU 计算
存储DisplayList 指令直接操作像素
性能

太硬核了。 Android 使用双缓冲机制来提高绘制效率。这意味着有两个缓冲区:一个在前台显示,一个在后台进行绘制。当后台缓冲区绘制完成后就会与前缓冲区交换位置。

DisplayList 是什么鬼?

在硬件加速模式下Canvas 并不会直接操作像素。而是会把你的绘图指令记录下来形成一个 DisplayList。这个 DisplayList 就像一个“录音带”, 求锤得锤。 记录了所有的绘图步骤。然后在 VSYNC 信号到来时RenderThread 会异步地施行 DisplayList 中的指令进行绘制。

软件渲染:老老实实操作像素

深得我心。 如果关闭了硬件加速或者设备不支持硬件加速,Canvas 就会老老实实地直接操作像素进行绘制。这种方式比较慢,但是兼容性更好。

Canvas 状态栈:记住你的画笔设置

状态管理很重要

Canvas 有一个状态栈用来保存当前的画笔设置。当你修改画笔设置时这些设置会被压入栈中。当你调用 s 差不多得了... ave 方法时, 当前的状态会被保存. 调用 restore 方法时, 则从栈中取出之前的状态并恢复.

为什么要用状态栈呢?

 //比方说: 画两个不同颜色的圆圈
canvas.save; // 保存当前状态
canvas.drawColor; // 设置颜色为红色
canvas.drawCircle); // 画一个红色的圆圈
canvas.restore; //恢复之前保存的状态
canvas.drawColor; // 设置颜色为蓝色
canvas.drawCircle);// 画一个蓝色的圆圈

一下


提交需求或反馈

Demand feedback