3. 开发环境搭建

好,咱们正式开始动手了。

前面两章聊了不少概念,什么刷新率、帧缓冲区、VSync。我知道,光听理论容易犯困。所以这一章,咱们直接创建一个真正的动画项目。目标很简单:让一个方块的颜色,从红色平滑过渡到蓝色。

别小看这个例子。它背后藏着 TouchGFX 动画引擎最核心的机制。搞懂了它,后面那些复杂的粒子效果、滑动页面,你理解起来会快得多。

3.1 创建空白工程

我个人习惯,每次学新东西都从零开始建工程。这样能清楚每一步做了什么,出了问题也知道去哪找。

  1. 打开 TouchGFX Designer。如果你装的是 4.18 以上版本,界面应该跟我差不多。
  2. 点击 “Create New Project”。
  3. 在弹出的对话框里,选 “Empty Application”。别选那些带模板的,那些东西会干扰我们理解底层逻辑。
  4. 给项目起个名字,比如 MyFirstAnimation。
  5. 选择你的目标平台。如果你手头有开发板,就选对应的型号。如果没有,选 Simulator 就行,咱们先在 PC 上跑通。
我的建议: 初学者尽量先用 Simulator。编译快,调试方便,还能随时看帧率。等逻辑没问题了,再烧到板子上验证硬件相关的坑。

点击 “Create”,等几秒钟。你会看到 Designer 自动生成了一个默认的 Screen,名字叫 Screen1。好,空白工程有了。

3.2 添加 Box 控件

接下来,我们要往屏幕上放一个方块。

  1. 在左侧的 “Widgets” 面板里,找到 “Containers” 分类下的 “Box”。
  2. 把它拖拽到中间的模拟屏幕上。
  3. 在右侧的属性面板里,调整一下大小和位置。我习惯设成 Width: 100,Height: 100,X: 110,Y: 100。这样它正好在屏幕中间偏左一点。
  4. 找到 “Color” 属性,先设成红色 #FF0000。

嗯,这里要注意。Box 控件是 TouchGFX 里最基础的绘制元素。它没有边框,没有图片,就是一个纯色的矩形块。说白了,它就是用来填充颜色的。

我在项目中遇到过有人用 Image 控件来做纯色背景,结果内存占用高了一倍。其实用 Box 就够了,轻量又高效。

3.3 实现颜色渐变动画

颜色放上去了,但它不会自己动。我们需要告诉 TouchGFX:从红色开始,花 2 秒钟,慢慢变成蓝色。

在 TouchGFX Designer 里做动画,靠的是 “Interactions”(交互)面板。

  1. 选中屏幕空白处,或者选中左侧的 “Screen1” 节点。
  2. 在下方找到 “Interactions” 标签页。
  3. 点击 “+” 按钮,新建一个 Interaction。
  4. Trigger(触发条件) 选择 Screen is started。意思是屏幕一显示,动画就开始。
  5. Action(动作) 选择 Animate widget。
  6. 在 “Target” 里,选择我们刚才放的那个 Box 控件。
  7. 在 “Animation” 部分,勾选 “Color”。
  8. End value 设成蓝色 #0000FF。
  9. Duration 设成 2000 毫秒,也就是 2 秒。
  10. Easing equation 保持默认的 Linear 就行。后面我们会专门讲缓动函数,现在先用线性的。
关键点: 这里的 Animate widget 动作,是 TouchGFX 内置的动画引擎入口。它支持对 Box 的 Color、Alpha、Position、Size 等属性做插值。你只需要告诉它“起点、终点、时间”,剩下的计算它全包了。

设置好之后,点击右上角的 “Run Simulator”。你会看到那个红色的方块,慢慢变成了蓝色。是不是很简单?

3.4 理解 Animation 原理

效果出来了,但咱们不能只停留在“会操作”的层面。你得知道背后发生了什么。

为什么颜色会平滑变化?

因为 TouchGFX 的动画引擎,在背后做了一件事:插值。

它把 2 秒钟切成了很多小段(通常是 60 段,因为屏幕每秒刷新 60 次)。每一段,它都计算一次当前应该显示什么颜色。

比如第 0 毫秒,颜色是 RGB(255, 0, 0)。
第 1000 毫秒(1 秒时),颜色是 RGB(128, 0, 128)。
第 2000 毫秒(2 秒时),颜色是 RGB(0, 0, 255)。

这个计算过程,就叫 线性插值。

下面这张图,能帮你更直观地理解这个流程:

TouchGFX 动画插值流程 TouchGFX 动画插值流程 触发条件 Screen is started 动画引擎 Animate widget 插值计算 线性 / 缓动 更新属性 Box.Color 每帧循环,直到时间结束 说明: 1. 屏幕启动时触发动画。 2. 动画引擎根据 Duration(2000ms)和 Easing 函数,计算每一帧的插值进度。 3. 每次更新 Box 的 Color 属性,并触发重绘。重复此过程直到动画结束。

你看,整个流程其实就是一个闭环。每次屏幕刷新(VSync 信号到来),动画引擎就检查一下:当前时间到了没?没到的话,算一下新的颜色值,更新到 Box 上,然后等下一次刷新。

这就是 Animation 原理 的核心:基于时间的属性插值 + 帧同步刷新。

3.5 避坑指南

操作虽然简单,但有几个坑,我曾经踩过,今天一并告诉你。

我曾经犯过的错:
  • 忘记设置 Duration: 默认值是 0。如果你没改,动画会瞬间完成,根本看不到渐变效果。
  • 在 Interaction 里同时修改多个属性: 比如同时勾选 Color 和 Position。虽然 TouchGFX 支持,但如果你对性能敏感,建议拆成两个独立的 Interaction,或者用更高级的 AnimationSequence。否则在低端 MCU 上可能掉帧。
  • 在动画运行中修改了起始值: 如果你在动画还没结束时,又触发了一次新的动画,TouchGFX 会从当前值开始插值。这本身没问题,但如果你没处理好,颜色可能会“跳变”。

3.6 小结与思考

这一章,我们亲手创建了第一个动画项目。从空白工程,到添加 Box,再到设置颜色渐变动画,最后理解了背后的插值原理。

你想想看,一个简单的颜色变化,背后其实涉及了:

  • 触发机制(Screen is started)
  • 动画引擎(Animate widget)
  • 插值算法(线性插值)
  • 帧同步(VSync 驱动更新)

这些概念,在 TouchGFX 里是通用的。不管以后你做滑动列表、翻页效果,还是自定义复杂动画,底层都是这套逻辑。

好,现在你可以去试试:把 Duration 改成 5000 毫秒,看看颜色变化是不是变慢了?再把 Easing 改成 EaseInOut,看看效果有什么不同?

动手试一下,比看十遍教程都管用。