arduino-esp32:LVGL中文字库(通用)

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

概述

(标题是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 文件的网站。
使用总顺序步骤如下图。
在这里插入图片描述
步骤如下:

  1. 文件名。首先需要给最后生成出来的字体文件取个名字,例如 my_font16.c ,这里就输入 my_font16
    在这里插入图片描述
  2. 字体大小。字库中每个字的像素大小。汉字由于较为复杂,太小了可能会变成一坨,啥也看不出,所以这里最好是稍微大一点。我一般用 16px。这个其实也就是源码中的字体文件后面的数字,代表着字体大小。
    在这里插入图片描述
  3. Bpp。bit per pixel,即每个像素所占的bit数。直接选4就行。
    在这里插入图片描述
  4. 选择字库源文件。点击选择文件后会打开文件系统,需要自行选择一个 ttf 格式或 woff 格式的字库。这个东西可以自己去百度搜,关键字例如 中文字库 ttf,就行。随便下载一个中文的ttf字库就可以。下载到本地之后上传到这里就行。最后的转换结果就是使用这个上传的字库里的字体。
    在这里插入图片描述
  5. Range。字符范围。看起来很奇怪,其实就是 Unicode 的范围。

统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

至于这个怎么选择,翻到这个网页下方,贴心的提供了一些参考网站。
在这里插入图片描述
第一个网站可以看到 Unicode 中每个16进制所代表的字符。我们一般最常用就是 0x20-0x7F 这个范围里的字符了,包括了数字、常用符号和所有大小写英文字符。
在这里插入图片描述
第二个网站提供了一个最直观的范围对应,如果你知道自己需要哪个标准字库,可以直接在这里找到范围。
在这里插入图片描述
回到配置项,我们可以根据需要来填写范围,抑或是单个字符,都可以填上去,中间以英文逗号分隔。
这里0x20-0x7F就是前文说的基础字符。
在这里插入图片描述

  • Symbols。具体的符号。如果说上方的 Range 提供的是一个大范围的字符选择,这里提供就是一些零散的精准字符选择。在这里你可以输入任何 Unicode 可编码的字符,如果你不嫌麻烦也可以将上面的 0x20-0x7F 代表的字符都在这一个一个输入进去,结果是一样的。
    在这里插入图片描述
  • 点击转换按钮即可。
    在这里插入图片描述
    点击之后,浏览器就会将网站自动生成的 C 文件下载到本地了。
    在这里插入图片描述
    这个文件就是我们自己的字库了。打开就可以看到我们在网站上输入的 RangeSymbols 里的字符了。

使用专属字库

首先把浏览器下载的 C 文件放进 lvgl/src/font 路径下。
在这里插入图片描述

VS模拟器

在资源管理器中的 lvgl/src/font 路径下右键添加现有项,选择刚才放进来的字库文件。
在这里插入图片描述
lv_conf.h 中,添加自定义的字体库。myfont_16 就是文件名。
在这里插入图片描述
重新生成解决方案。
在这里插入图片描述
回到最开始的例子里,修改下图中参数为这个字体。
在这里插入图片描述

效果

再次运行,可以发现我们配置的 label 中的字体已经变成刚才使用中文字库生成的字体了。 字也出现了。
在这里插入图片描述

arduino-esp32

基本流程都是一样的。不过需要修改一下包含路径。

  • myfont_16.c 文件放进 lvgl-master/src/font 文件夹中。
  • 修改 myfont_16.c 的路径信息。将#include lvgl/lvgl.h修改为#include ../../lvgl.h
    在这里插入图片描述
  • lv_conf.h 中配置自定义字体库LV_FONT_DECLARE(myfont_16)
效果

这是我自己正在用的界面,16px在屏幕上效果还可以。
在这里插入图片描述

小结

官方的这个转换网站还是很方便的,如果有新添加的字符或是文字,随时可以再次添加,然后生成一个新的文件替换掉之前的文件即可。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值