2、LVGL内置字体:LVGL内置字体种类、内置字体特点、内置字体使用场景

好,咱们今天聊聊LVGL内置字体。说实话,这部分内容看起来简单,但很多新手朋友容易在这里栽跟头。我刚开始用LVGL的时候,就犯过一个低级错误——直接用了默认字体,结果在128x64的小屏上,界面挤得跟蚂蚁窝似的。嗯,从那以后,我对内置字体就格外上心了。

2.1 内置字体种类

LVGL内置了哪些字体?说白了,就是官方帮你编译好的、可以直接用的字体文件。它们都藏在 lvgl/src/font/ 目录下。我个人习惯把它们分成三大类:

  • 基础字体(Montserrat系列):这是LVGL的默认字体,也是用得最多的。它包含 lv_font_montserrat_1214162028 等字号。数字代表像素高度,比如 lv_font_montserrat_16 就是16像素高的字体。
  • 符号字体(FontAwesome & Material Icons):专门用来显示图标的。比如 lv_font_material_icons_16lv_font_fontawesome_16。你想想看,按钮上放个齿轮图标,是不是比写个"设置"文字要直观得多?
  • 特殊字体:包括 lv_font_unscii_8(8x8像素点阵字体)和 lv_font_unscii_16(16x16像素点阵字体)。这些适合极简显示,比如LED点阵屏。

核心要点:内置字体都是等宽字体,每个字符占用的宽度相同。这在做表格或对齐显示时特别方便。

2.2 内置字体特点

内置字体有什么特点?我总结了四点,你记一下:

  1. 零依赖,开箱即用:不需要额外加载字体文件,直接 #include "lvgl.h" 就能用。我在做原型验证时,最喜欢用内置字体,省事。
  2. 体积小,适合资源受限设备:以 lv_font_montserrat_12 为例,它只包含ASCII字符(0x20-0x7F),整个字体表才几KB。对于RAM只有几十KB的MCU来说,这简直是福音。
  3. 不支持中文:这是最大的限制。内置字体只包含拉丁字母、数字和常用符号。你想想看,如果要在界面上显示"温度:25°C",内置字体只能显示"25°C","温度"两个字会变成方框。
  4. 抗锯齿效果一般:内置字体用的是1位或2位抗锯齿,在低分辨率屏幕上效果还行,但在高DPI屏幕上,边缘会有明显的锯齿感。我曾在320x240的屏幕上试过,嗯,凑合能用。
字体名称 像素高度 字符集 典型占用ROM
lv_font_montserrat_12 12px ASCII ~3KB
lv_font_montserrat_16 16px ASCII ~5KB
lv_font_montserrat_28 28px ASCII ~12KB
lv_font_unscii_8 8px ASCII ~1KB

小技巧:如果你只需要显示数字和英文字母,内置字体完全够用。我曾经在一个温控器项目里,只用 lv_font_montserrat_20 就搞定了所有显示,连图标都没用。

2.3 内置字体使用场景

内置字体到底什么时候用?我根据实际项目经验,给你列几个典型场景:

  • 原型验证阶段:快速搭建UI,验证交互逻辑。这时候用内置字体最省事,不用折腾字体转换工具。
  • 纯英文/数字界面:比如仪表盘、计数器、状态指示灯。我做过一个空气质量检测仪,所有显示都是"PM2.5: 35 μg/m³"这种格式,内置字体完美胜任。
  • 低分辨率屏幕:128x64、160x80这类小屏。内置字体像素小,能显示更多内容。我记得有个项目用 lv_font_montserrat_12 在128x64屏上显示了4行文字,每行10个字符,效果还不错。
  • 资源极度受限的MCU:比如Flash只有64KB、RAM只有8KB的芯片。内置字体不占额外空间,能省则省。

避坑指南:我曾经在一个项目里,直接用内置字体显示中文,结果所有中文字符都变成了方框。后来排查了半天,才发现是字体不支持。所以,只要界面涉及中文、日文、韩文等非拉丁字符,就别用内置字体,老老实实去转换自定义字体吧。

最后说一句,内置字体虽然简单,但它是LVGL字体体系的基石。你理解了内置字体的优缺点,后面学自定义字体时,就能明白为什么需要那些复杂的配置了。好,这一节就到这儿,下一节我们聊聊如何转换自定义字体。