arduino-esp32:LVGL中文字库(通用)
导航
概述
(标题是arduino-esp32只是因为平台是这个🙃)
LVGL默认的字库是英文的,当然其字库文件里也有一个带有中文的字库 lv_font_simsun_16_cjk ,不过里面的中文字并不多而且很多是繁体。这篇说一下怎么自己制作一个中文的字库并使用到LVGL中。
系统自带中文字库
在目录 lvgl/src/font 下,存放着官方自带的所有字库文件。其中 lv_font_simsun_16_cjk.c 就是自带的中文字库了。
在这个文件的头部列举出了一部分的文字,其实就是一部分的CJK编码的文字。包括中文、日文、韩文中的一部分的文字。
不过也只有很少一部分的汉字在这里面,而且有很多都是以繁体的形式给出的。
如果需要使用到的文字刚好这里面都有的话,那么可以直接使用这个字库就行了,不需要自己制作。
要使用这个字库也很简单。
首先在配置文件 lv_conf.h 中,找到这一段。系统默认是只选择使用了14px的 Montserrat 字体。
默认的字体也是这个。
只需要把这个 lv_font_simsun_16_cjk 字库的宏修改为1就可以了。
当然如果使用VS模拟器的话这些字库是全开的,在真正的开发板上是肯定做不到全开,内存肯定不够。
使用自带中文字库
首先在主文件里将 lv_demo_widghts.c 示例给注释掉。
打开下面的 lv_example_label_1() 示例。
这个例子会生成几个 label 组件的例子,更方便查看效果。
我们在不对字体做任何修改的情况下,按住ctrl点击这个函数,进入原代码中,在这里添加一行中文。
点击运行后,发现是不会显示的。
而且控制台也在不停的报错。找不到这些中文的编码。
尝试在这里添加这行代码lv_obj_set_style_text_font(label2, &lv_font_simsun_16_cjk, 0);
。
这条语句会将指定的组件的默认字体样式由 LV_FONT_MONTSERRAT_14 修改为 LV_FONT_SIMSUN_16_CJK。
接下来再试试编译运行,可以发现只显示了一部分的汉字。这 这个字并没有显示出来。
当然原因就是 这 这个字在字库里没有。
制作专属字库
首先打开LVGL官网lvgl.io,打开工具栏的 font converter。
这是一个LVGL官方提供的将字库转化为LVGL专属的 C 文件的网站。
使用总顺序步骤如下图。
步骤如下:
- 文件名。首先需要给最后生成出来的字体文件取个名字,例如 my_font16.c ,这里就输入 my_font16 。
- 字体大小。字库中每个字的像素大小。汉字由于较为复杂,太小了可能会变成一坨,啥也看不出,所以这里最好是稍微大一点。我一般用 16px。这个其实也就是源码中的字体文件后面的数字,代表着字体大小。
- Bpp。bit per pixel,即每个像素所占的bit数。直接选4就行。
- 选择字库源文件。点击选择文件后会打开文件系统,需要自行选择一个 ttf 格式或 woff 格式的字库。这个东西可以自己去百度搜,关键字例如 中文字库 ttf,就行。随便下载一个中文的ttf字库就可以。下载到本地之后上传到这里就行。最后的转换结果就是使用这个上传的字库里的字体。
- Range。字符范围。看起来很奇怪,其实就是 Unicode 的范围。
统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
至于这个怎么选择,翻到这个网页下方,贴心的提供了一些参考网站。
第一个网站可以看到 Unicode 中每个16进制所代表的字符。我们一般最常用就是 0x20-0x7F 这个范围里的字符了,包括了数字、常用符号和所有大小写英文字符。
第二个网站提供了一个最直观的范围对应,如果你知道自己需要哪个标准字库,可以直接在这里找到范围。
回到配置项,我们可以根据需要来填写范围,抑或是单个字符,都可以填上去,中间以英文逗号分隔。
这里0x20-0x7F就是前文说的基础字符。


点击之后,浏览器就会将网站自动生成的 C 文件下载到本地了。

这个文件就是我们自己的字库了。打开就可以看到我们在网站上输入的 Range 和 Symbols 里的字符了。
使用专属字库
首先把浏览器下载的 C 文件放进 lvgl/src/font 路径下。
VS模拟器
在资源管理器中的 lvgl/src/font 路径下右键添加现有项,选择刚才放进来的字库文件。
在 lv_conf.h 中,添加自定义的字体库。myfont_16 就是文件名。
重新生成解决方案。
回到最开始的例子里,修改下图中参数为这个字体。
效果
再次运行,可以发现我们配置的 label 中的字体已经变成刚才使用中文字库生成的字体了。这 字也出现了。
arduino-esp32
基本流程都是一样的。不过需要修改一下包含路径。
#include lvgl/lvgl.h
修改为#include ../../lvgl.h
。
LV_FONT_DECLARE(myfont_16)
。效果
这是我自己正在用的界面,16px在屏幕上效果还可以。
小结
官方的这个转换网站还是很方便的,如果有新添加的字符或是文字,随时可以再次添加,然后生成一个新的文件替换掉之前的文件即可。