3、第一个TouchGFX项目:创建空白项目、理解项目结构、屏幕(Screen)与容器(Container)的概念、模拟器运行

说实话,学任何新框架,最怕的就是一上来就面对一堆看不懂的文件。我当年第一次打开TouchGFX生成的工程时,也愣了几秒——这文件夹里都是些啥?

别急,这一章我们就亲手创建一个空白项目,然后把它拆开看看。你很快就会发现,TouchGFX的项目结构其实非常清晰,核心就两个东西:Screen(屏幕)和Container(容器)。

3.1 创建空白项目

打开TouchGFX Designer,点击右上角的“Create New Project”。你会看到几个模板选项:

  • Empty UI —— 我们选这个,从零开始。
  • Template UI —— 带一些预置控件,适合快速验证。
  • Demo —— 完整示例,适合参考学习。

选Empty UI,然后配置项目参数:

参数 推荐值 说明
Project Name MyFirstProject 项目名称,建议用英文
Resolution 480x272 模拟器默认分辨率,后面可以改
Color Depth 16-bit RGB565 大多数嵌入式屏都支持
Target Platform Simulator 先跑模拟器,不急着烧硬件

点击Create,几秒钟后项目就生成了。嗯,就是这么简单。

我的习惯:项目名不要带空格和中文,否则后面编译可能会遇到路径问题。我曾经因为项目名叫“第一个项目”折腾了半小时,后来老老实实改成了“FirstProject”。

3.2 理解项目结构

创建完成后,我们看看TouchGFX Designer自动生成了哪些文件。切换到文件视图(File View),你会看到这样的结构:

MyFirstProject/
├── assets/                # 资源文件(图片、字体、文本)
├── generated/             # 自动生成的代码(不要手动改!)
├── gui/                   # 你的UI代码写在这里
│   ├── include/           # 头文件
│   └── src/               # 源文件
├── platform/              # 平台适配层(驱动、OS接口)
├── target/                # 目标板配置
├── TouchGFX/              # TouchGFX框架核心
├── CMakeLists.txt         # CMake构建文件
└── MyFirstProject.touchgfx  # Designer项目文件

你可能会问:这么多文件夹,我到底该动哪个?

说白了,你平时打交道最多的就是gui/目录。Designer生成的界面代码放在generated/里,你写的业务逻辑放在gui/里。两者互不干扰,这也是TouchGFX设计得比较聪明的地方。

核心原则:generated目录下的文件不要手动修改。如果你改了,下次Designer重新生成时会直接覆盖掉。我见过有人改了这个目录下的代码,结果升级TouchGFX版本后项目直接编译不过……

3.3 Screen(屏幕)与Container(容器)的概念

这是TouchGFX里最基础的两个概念。理解它们,后面的动画、交互就都好办了。

什么是Screen?

Screen就是一整个屏幕。你可以把它理解成手机上的一个页面——比如主界面、设置界面、游戏界面。每个Screen占据整个显示区域,同一时间只能显示一个Screen。

什么是Container?

Container是屏幕里的组件。比如一个按钮、一个进度条、一个图片框,甚至是一组控件的集合。Container可以嵌套,一个Container里可以放另一个Container。

我习惯这样记:Screen是舞台,Container是演员。舞台一次只能有一个,但演员可以有很多个,还能组合表演。

概念 生命周期 典型用途 能否嵌套
Screen 进入时创建,离开时销毁 页面切换、主界面 不能嵌套Screen
Container 随Screen创建,可复用 按钮、列表项、自定义控件 可以嵌套Container
注意:Container不能单独存在,必须依附于某个Screen。如果你想把一个Container用在多个Screen里,可以把它做成自定义Container(Custom Container),后面我们会专门讲。

用SVG理解Screen和Container的关系

下面这张图展示了Screen和Container的层级关系。你看,Screen是顶层,下面挂着多个Container,Container里还能再挂子Container。

Screen 与 Container 层级关系 Screen(屏幕) Container A Container B Container C 子Container B1 子Container B2 Screen 是顶层容器,Container 可以嵌套,但 Screen 之间不能嵌套

你看,Container B下面还挂了两个子Container。这种嵌套结构在实际项目中非常常见——比如一个列表项(Container)里包含图标、文字、进度条三个子Container。

3.4 在Designer中添加第一个Screen和Container

回到TouchGFX Designer,默认已经有一个Screen了,叫Screen1。我们来做点实际的操作:

  1. 在左侧Widgets面板里,找到Container,拖到中间的画布上。
  2. 选中这个Container,在右侧属性面板里把它的Width改成200,Height改成100。
  3. 再拖一个Text Area放到Container里面,文字改成“Hello TouchGFX”。

就这么几步,你已经创建了一个包含文本的Container。是不是很简单?

我的经验:刚开始学的时候,我总想把所有控件都直接放在Screen上。后来发现,用Container把相关控件分组管理,代码会清晰很多。比如一个温度显示区域,我把温度数值、单位符号、背景框都放在一个Container里,移动和修改都方便。

3.5 模拟器运行

UI搭好了,总得看看效果吧?TouchGFX的模拟器非常方便,不需要硬件就能跑。

点击Designer右下角的Run Simulator按钮(绿色小三角)。第一次运行会编译项目,可能需要几十秒。编译完成后,模拟器窗口就会弹出来。

你会看到:

  • 一个480x272的模拟屏幕
  • 你刚才添加的Container和文字
  • 鼠标可以模拟触摸操作

嗯,这就是你的第一个TouchGFX应用。虽然现在啥交互都没有,但至少跑起来了。

常见问题:如果模拟器启动后黑屏,检查一下你的电脑是否安装了OpenGL驱动。TouchGFX模拟器依赖OpenGL渲染,有些虚拟机环境可能不支持。我遇到过在远程桌面里跑模拟器,结果黑屏——换成物理机就好了。

3.6 本章小结

这一章我们做了三件事:创建了空白项目、理解了项目结构、搞清楚了Screen和Container的区别。最后还让模拟器跑了起来。