2、LVGL内置字体:LVGL内置字体种类、内置字体特点、内置字体使用场景
好,咱们今天聊聊LVGL内置字体。说实话,这部分内容看起来简单,但很多新手朋友容易在这里栽跟头。我刚开始用LVGL的时候,就犯过一个低级错误——直接用了默认字体,结果在128x64的小屏上,界面挤得跟蚂蚁窝似的。嗯,从那以后,我对内置字体就格外上心了。
2.1 内置字体种类
LVGL内置了哪些字体?说白了,就是官方帮你编译好的、可以直接用的字体文件。它们都藏在 lvgl/src/font/ 目录下。我个人习惯把它们分成三大类:
- 基础字体(Montserrat系列):这是LVGL的默认字体,也是用得最多的。它包含
lv_font_montserrat_12、14、16、20、28等字号。数字代表像素高度,比如lv_font_montserrat_16就是16像素高的字体。 - 符号字体(FontAwesome & Material Icons):专门用来显示图标的。比如
lv_font_material_icons_16和lv_font_fontawesome_16。你想想看,按钮上放个齿轮图标,是不是比写个"设置"文字要直观得多? - 特殊字体:包括
lv_font_unscii_8(8x8像素点阵字体)和lv_font_unscii_16(16x16像素点阵字体)。这些适合极简显示,比如LED点阵屏。
核心要点:内置字体都是等宽字体,每个字符占用的宽度相同。这在做表格或对齐显示时特别方便。
2.2 内置字体特点
内置字体有什么特点?我总结了四点,你记一下:
- 零依赖,开箱即用:不需要额外加载字体文件,直接
#include "lvgl.h"就能用。我在做原型验证时,最喜欢用内置字体,省事。 - 体积小,适合资源受限设备:以
lv_font_montserrat_12为例,它只包含ASCII字符(0x20-0x7F),整个字体表才几KB。对于RAM只有几十KB的MCU来说,这简直是福音。 - 不支持中文:这是最大的限制。内置字体只包含拉丁字母、数字和常用符号。你想想看,如果要在界面上显示"温度:25°C",内置字体只能显示"25°C","温度"两个字会变成方框。
- 抗锯齿效果一般:内置字体用的是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字体体系的基石。你理解了内置字体的优缺点,后面学自定义字体时,就能明白为什么需要那些复杂的配置了。好,这一节就到这儿,下一节我们聊聊如何转换自定义字体。