标签控件(lv_label)显示中文
介绍
LVGL内置有一个可以显示某些中文字符的字库 CJK字库 我们可以直接使用,这个字库在 lv_conf.h
中定义为:LV_FONT_SIMSUN_16_CJK (\lvgl\src\font\lv_font_simsun_16_cjk.c
)。
如果要在lvgl中使用显示自己的中文字库,我们需要用到两个东西:字体文件和字体转换器。
字体文件我们可以使用开源的字体或者自己制作出来,准备好了字体文件之后使用字体转换器即可转换成可以在lvgl上使用的字体格式。开源字体获取页面:https://lvgl.100ask.net/master/extra/fonts-zh-source.html
准备好字体文件之后就可以通过lvgl官方提供的字体转换器,提取转换你想要的字体,LVGL官方在线字体转换器页面:
https://lvgl.io/tools/fontconverter
如何使用字体转换器?
- 为要输出字体命名。例如“lv_font_source_han_sans_bold_20”
- 以 px为单位指定高度(字体大小)
- 设置bpp (bit-per-piel)。值越高,字体越平滑(抗锯齿)
- 选择TTF 或 WOFF 格式字体文件
- 设置要包含在字体中的 Unicode 字符范围或在符号字段中列出字符
- 可以同时选择多个字体文件转换,并为其指定范围和/或符号。这些字符将被合并转换到同一个文件中。
- 单击转换按钮以下载转换出来的 font_source_han_sans_bold_20.c 文件。
Fallback选项是备用字体,如果当前的字体无法找到字符时,lvgl会尝试使用备选方案,如果备选方案中有自己的的备选方案,那么如果条件符合会继续使用备选方案,直到没有设置fallback为止。
文档阅读:https://lvgl.100ask.net/9.1/overview/font.html#use-font-fallback
如何在 LVGL 中使用生成的字体?
-
将结果 C 文件复制到你的 LVGL 项目中,并包含到项目;
-
在你的项目应用程序的 C 文件中,将字体声明为:
// 这样声明 extern lv_font_t my_font_name; // 或者这样声明 LV_FONT_DECLARE(my_font_name);
-
通过样式中设置字体:
lv_style_set_text_font(&style_obj, &my_font_name); // 普通(共享)样式 lv_obj_set_style_text_font(label, &my_font_name, 0); // 私有(本地)样式
unicode 是统一所有语言的一套编码。
utf-8是基于unicode编码的一种节约字节的编码。
有用的笔记
-
用于提取指定字符的Unicode编码工具:https://unicode-table.com
-
LVGL内置字符列表(lv_font_simsun_16_cjk.c),使用的字体是FontAwesome:
61441,61448,61451,61452,61452,61453,61457,61459,61461,61465, 61468,61473,61478,61479,61480,61502,61512,61515,61516,61517, 61521,61522,61523,61524,61543,61544,61550,61552,61553,61556, 61559,61560,61561,61563,61587,61589,61636,61637,61639,61671, 61674,61683,61724,61732,61787,61931,62016,62017,62018,62019, 62020,62087,62099,62212,62189,62810,63426,63650
-
要了解有关LVGL字体处理的更多信息,请阅读这个指南
-
要脱离LVGL使用字体引擎,可以从这里开始:
lv_font.c/h
、lv_font_fmt_txt.c/h
。
课后思考
- 无论是使用lvgl内置的字体还是自己生成的字体,在更新显示内容时整体会有抖动,如何做到不抖动?