解码LVGL中文字体、输入框、键盘 - 详解
字体控件(lv_label + 字体管理):中文显示方案
LVGL 内置字体仅支持英文 / 数字,中文需 “提取固定汉字” 或 “动态加载 TTF”。
场景 1:有限汉字(固定文本,如 “登录”“取消”)
适用于固定中文文本,通过 LVGL 字库生成器提取汉字转 C 数组。
Step1:生成中文字库(关键参数)
打开工具:LVGL 在线字库生成器;
配置参数:
参数名 配置值 / 说明 作用 Name simkai_26(符合 C 标识符规则) 字库名称 Size 26(像素,按屏幕分辨率调整) 字体大小 Bpp 4bit(平衡质量与内存) 像素色深 TTF/WOFF font 上传中文字体(如 simfang.ttf) 字体源文件 Range/Characters 输入所需汉字(如 “登录 注册 123”) 仅提取需要的字符(减少内存) 生成 simkai_26.c (数组类型为 lv_font_t)。
Step2:代码使用(绑定到按钮 / 标签)
CMakeLists.txt下将字体的.c文件加入生成可执行文件的依赖

#include "lvgl/lvgl.h" LV_FONT_DECLARE(simkai_26); // 声明中文字库 extern const lv_font_t simkai_26; //声明外部变量 /** * 创建带中文字体的按钮 * @param parent:父对象 * @param text:按钮文本(如“登录”) * @param x/y_ofs:偏移量 */ lv_obj_t *btn_create_with_cn(lv_obj_t *parent, const char *text, int32_t x_ofs, int32_t y_ofs) { // 创建按钮 lv_obj_t *btn = lv_btn_create(parent); lv_obj_set_size(btn, 100, 70); lv_obj_align(btn, LV_ALIGN_CENTER, x_ofs, y_ofs); // 创建标签(显示中文) lv_obj_t *label = lv_label_create(btn); lv_label_set_text(label, text); // 绑定中文字体(核心:否则乱码) lv_obj_set_style_text_font(label, &simkai_26, LV_PART_MAIN); lv_obj_center(label); return btn; } // 调用示例(登录/注册按钮) void btn_cn_demo(void) { lv_obj_t *scr = lv_scr_act(); btn_create_with_cn(scr, "登录", -100, 0); // 左偏100px btn_create_with_cn(scr, "注册", 100, 0); // 右偏100px }
效果:

场景 2:不限汉字(动态文本,如用户输入)
适用于动态中文场景(如新闻展示、用户输入框、可变文本内容),核心是通过 LVGL 集成 FreeType 库 实时加载 TTF/OTF 字体文件,支持任意汉字及字体样式(粗体、斜体)。
核心前提
FreeType 是 LVGL 的扩展库,用于运行时生成字体位图,无需预编译字体(,灵活适配动态文本需求。
Step1:启用 FreeType 并配置(修改 lv_conf.h)
必须先在 LVGL 配置文件中启用 FreeType,核心配置项需与官方文档一致:
/*FreeType 字体库配置*/
#define LV_USE_FREETYPE 1 // 启用 FreeType
#if LV_USE_FREETYPE
#define LV_FREETYPE_USE_LVGL_PORT 0 // Linux 用原生接口,无需 LVGL 适配
#define LV_FREETYPE_CACHE_FT_GLYPH_CNT 65535 // 大内存,缓存拉满
#endif
/*FreeType 字体库配置*/
#define LV_USE_FREETYPE 1 // 启用 FreeType
#if LV_USE_FREETYPE
#define LV_FREETYPE_USE_LVGL_PORT 1 // 复用 LVGL 适配的开发板文件系统/内存
#define LV_FREETYPE_CACHE_FT_GLYPH_CNT 4096 // 适配 128KB RAM,缓存 4096 个常用字形
#endif
CMakeList.txt中添加freetype库的内容
# 添加字体库头文件
# 核心修正:给 LVGL 目标单独添加包含路径(LVGL 编译时会用到)
target_include_directories(lvgl
PRIVATE
${PROJECT_SOURCE_DIR}/my_app/libs/freetype/include/freetype2
)
# 同时确保你的项目目标也能识别(若需自己的代码调用 FreeType)
target_include_directories(${PROJECT_NAME}
PRIVATE
${PROJECT_SOURCE_DIR}/my_app/libs/freetype/include/freetype2
)
# 指定外部库的搜索路径
link_directories(${PROJECT_SOURCE_DIR}/my_app/libs/freetype/lib)
# 在 find_package(Freetype) 之前添加,替换成你的 FreeType 安装路径
set(CMAKE_PREFIX_PATH "/home/wby/LVGL/Ubuntu/lv_port_linux-9.2/my_app/libs/freetype" ${CMAKE_PREFIX_PATH})
# 查找已安装的 FreeType 库(核心步骤)
find_package(Freetype REQUIRED)
#链接freetype 将Freetype::Freetype加在后面
target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${Libdrm_LIBRARIES} m pthread Freetype::Freetype)
Step2:集成 FreeType 到项目(分场景适配)
根据运行环境选择集成方式,嵌入式设备优先「源码集成」(节省 FLASH),UNIX / 开发板可选择「编译安装」。
场景 A:嵌入式设备——无操作系统(推荐源码集成)
直接将 FreeType 源码嵌入项目,使用 LVGL 提供的精简配置(仅保留核心功能):
- 下载 FreeType 源码:从 FreeType 官网 下载最新稳定版(如 2.13.2)。
- 复制源码到项目:将 FreeType 源码目录复制到项目中(如
project/libs/freetype/)。 - 修改项目编译脚本(Makefile/CMake):添加编译参数和源码文件,需包含 LVGL 提供的配置头文件:
# FreeType 编译宏(必须,指定 LVGL 精简配置)
CFLAGS += -DFT2_BUILD_LIBRARY # 编译 FreeType 库本身
CFLAGS += -DFT_CONFIG_MODULES_H= # LVGL 精简模块配置
CFLAGS += -DFT_CONFIG_OPTIONS_H= # LVGL 精简选项配置
# 头文件路径(FreeType 源码的 include 目录)
CFLAGS += -I./libs/freetype/include
# 需编译的 FreeType 核心源码(LVGL 推荐最小集,节省 FLASH)
FT_CSRCS += ./libs/freetype/src/base/ftbase.c
FT_CSRCS += ./libs/freetype/src/base/ftbitmap.c
FT_CSRCS += ./libs/freetype/src/base/ftdebug.c
FT_CSRCS += ./libs/freetype/src/base/ftglyph.c
FT_CSRCS += ./libs/freetype/src/base/ftinit.c
FT_CSRCS += ./libs/freetype/src/cache/ftcache.c
FT_CSRCS += ./libs/freetype/src/gzip/ftgzip.c
FT_CSRCS += ./libs/freetype/src/sfnt/sfnt.c
FT_CSRCS += ./libs/freetype/src/smooth/smooth.c
FT_CSRCS += ./libs/freetype/src/truetype/truetype.c
# 将 FreeType 源码加入项目编译
CSRCS += $(FT_CSRCS)
- 复制 TTF 字体文件:将需要的中文字体(如
simkai.ttf、simfang.ttf)放到设备可访问路径(如./fonts/,嵌入式需放在文件系统挂载目录)。
场景 B:UNIX / 开发板——有操作系统(编译安装库)
适合有操作系统(如 Linux、Android)的设备,通过编译生成动态库链接使用:
- 下载 FreeType 源码:同上。
- 编译安装 FreeType:
# 进入源码目录
cd freetype-2.13.2
#注意!!!修改./configure和makefile的权限,安装在系统路径要加sudo
# 配置编译(嵌入式开发板需替换交叉编译器,如 arm-linux-gcc)
# 本地 UNIX 直接用:./configure --prefix=安装路径
# 开发板交叉编译示例:
export CC=arm-linux-gcc # 设置交叉编译器
./configure --host=arm-linux --prefix=/usr/local/freetype-arm \
--enable-shared=yes --enable-static=no
# 编译并安装(生成动态库 libfreetype.so)
make
make install
- 部署库文件和字体:
- 复制编译生成的
libfreetype.so.*到开发板/lib或/usr/lib目录; - 复制 TTF 字体文件到开发板可访问路径(如
/usr/share/fonts/或./fonts/)。
- 复制编译生成的
- 项目链接 FreeType:编译项目时添加链接参数:
gcc your_code.c -o app \
-I/usr/include/freetype2 -I./lvgl/src \
-L/usr/local/lib -lfreetype # 链接 FreeType 库
Step3:代码实现(动态加载 TTF 字体并显示)
遵循 LVGL 官方 API 规范
#include "lvgl/lvgl.h"
#include "lvgl/src/libs/freetype/lv_freetype.h" // FreeType 核心头文件
/**
* 动态加载 TTF 字体并创建中文标签
* @param parent:父对象(如屏幕、容器)
* @param ttf_path:TTF 字体文件路径(绝对/相对路径)
* @param font_size:字
浙公网安备 33010602011771号