1. TouchGFX 字体基础:字体在嵌入式GUI中的角色

做嵌入式 GUI 的朋友都知道,字体这东西看着不起眼,但真踩坑了能让你调一整天。我刚开始用 TouchGFX 做项目时,就吃过字体的亏——界面跑起来,中文全变成方框,英文倒是好好的。后来才明白,字体在嵌入式系统里,远不止「选个好看的」那么简单。

字体在嵌入式GUI中的角色

说白了,字体就是 GUI 的「皮肤」。用户第一眼看到的不是你的业务逻辑,而是文字清不清晰、排版舒不舒服。在 TouchGFX 里,字体承担了三个核心任务:

  • 信息传递:按钮标签、数据数值、状态提示,全靠字体把内容呈现给用户
  • 视觉体验:字重、字间距、抗锯齿效果,直接影响界面的专业感
  • 资源消耗:字体数据占用的 Flash 和 RAM,往往是 GUI 资源的大头

我记得有个项目,产品经理非要我用思源黑体 Regular + Bold 两个字重,结果光字体就占了 2MB Flash。MCU 总共才 8MB,你说这还怎么塞其他功能?所以从项目一开始,就得把字体当成「资源」来管理,而不是随便丢个 .ttf 进去就完事。

核心观点:在嵌入式环境里,字体既是功能组件,也是资源瓶颈。你越早意识到这一点,后面踩的坑就越少。

字体文件格式:.ttf 与 .otf

TouchGFX 支持两种常见的字体格式:TrueType(.ttf)和 OpenType(.otf)。它们有什么区别?我直接给你列个表:

特性 .ttf(TrueType) .otf(OpenType)
曲线技术 二次贝塞尔曲线 三次贝塞尔曲线(更平滑)
字重支持 通常每个字重一个文件 支持可变字体(一个文件多个字重)
文件大小 相对较小 可能更大(含更多排版特性)
嵌入式兼容性 最广泛,TouchGFX 首选 部分特性可能不被支持
中文支持 常见中文字体多为 .ttf 较少见,但效果更好

我个人习惯用 .ttf 格式。为什么?因为 TouchGFX 的 TextConverter 对 .ttf 的支持最成熟,踩坑概率最低。有一次我试了个 .otf 字体,结果生成出来的字模间距全乱了,排查了半天才发现是字体本身的 OpenType 特性跟 TouchGFX 的渲染引擎不兼容。

我的建议:除非你明确需要 .otf 的特殊排版能力(比如连字、花体),否则一律用 .ttf。省心。

TouchGFX 字体生成器:TextConverter 简介

TextConverter 是 TouchGFX 自带的字体工具。它的工作流程其实很简单:

  1. 你给它一个 .ttf 或 .otf 文件
  2. 告诉它你要哪些字符(比如只取 ASCII + 常用中文)
  3. 设置字号、字重、抗锯齿等级
  4. 它生成一个 .ttf 字体缓存文件 + 对应的 C++ 头文件

嗯,这里要注意:TextConverter 不是直接把整个字体塞进去,而是只提取你需要的字符。你想想看,一个中文字体动辄一两万个汉字,你的界面可能只用得到几百个。TextConverter 帮你做「瘦身」,这就是字体压缩的第一步。

我曾经踩过的坑:有一次我忘了在 TextConverter 里指定字符范围,结果它把整个字体文件都转换了。生成出来的字体缓存足足 3.5MB,直接把 MCU 的 Flash 撑爆。从那以后,我每次都会先列一个「界面用字清单」,再交给 TextConverter 处理。

TextConverter 的界面长这样(我画了个简图帮你理解):

TextConverter 工作流程 TextConverter 字体生成流程 输入 .ttf / .otf 字体源文件 配置参数 字号 / 字符集 / 抗锯齿 生成输出 .ttf 缓存 + .hpp 关键配置项说明 • 字符范围:只选择界面用到的字符(如 0x0020-0x007E + 常用汉字) • 抗锯齿等级:4bpp(推荐) / 2bpp(省空间) / 1bpp(最小但锯齿明显) • 字重:Regular / Bold / Italic,每个字重独立生成 生成产物 1:字体缓存 .ttf 文件(二进制字模数据) 生成产物 2:C++ 头文件 .hpp 文件(字体描述 + 字符映射表) 最终在 TouchGFX Designer 中引用生成的 .hpp 文件即可使用该字体

TextConverter 生成的产物有两个:一个是 .ttf 字体缓存文件(里面存的是每个字符的像素点阵数据),另一个是 .hpp 头文件(告诉 TouchGFX 这个字体叫什么、有多大、字符映射表在哪)。这两个文件缺一不可。

记住:TextConverter 是你做字体压缩的第一个武器。后面几章我们会深入讲怎么用它做「精准瘦身」——只保留你需要的字符,把字体体积压到最小。