解码LVGL中文字体、输入框、键盘 - 详解

字体控件(lv_label + 字体管理):中文显示方案

LVGL 内置字体仅支持英文 / 数字,中文需 “提取固定汉字” 或 “动态加载 TTF”。

场景 1:有限汉字(固定文本,如 “登录”“取消”)

适用于固定中文文本,通过 LVGL 字库生成器提取汉字转 C 数组。

  • Step1:生成中文字库(关键参数)

    打开工具:LVGL 在线字库生成器

    配置参数:

    参数名配置值 / 说明作用
    Namesimkai_26(符合 C 标识符规则)字库名称
    Size26(像素,按屏幕分辨率调整)字体大小
    Bpp4bit(平衡质量与内存)像素色深
    TTF/WOFF font上传中文字体(如 simfang.ttf)字体源文件
    Range/Characters输入所需汉字(如 “登录 注册 123”)仅提取需要的字符(减少内存)

    生成 simkai_26.c (数组类型为 lv_font_t)。

  • Step2:代码使用(绑定到按钮 / 标签)

    CMakeLists.txt下将字体的.c文件加入生成可执行文件的依赖

    image

    #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
    }

效果:

image

场景 2:不限汉字(动态文本,如用户输入)

适用于动态中文场景(如新闻展示、用户输入框、可变文本内容),核心是通过 LVGL 集成 FreeType 库 实时加载 TTF/OTF 字体文件,支持任意汉字及字体样式(粗体、斜体)。

核心前提

FreeType 是 LVGL 的扩展库,用于运行时生成字体位图,无需预编译字体(,灵活适配动态文本需求。

官方文档:https://www.freetype.org

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.ttfsimfang.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:字
posted @ 2025-12-09 08:22  clnchanpin  阅读(19)  评论(0)    收藏  举报