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

导航

  • 概述
  • 系统自带中文字库
  • 使用自带中文字库
  • 制作专属字库
  • 使用专属字库
  • VS模拟器
  • 效果
  • arduino-esp32
  • 效果
  • 小结
  • 概述

    (标题是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在屏幕上效果还可以。

    小结

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » arduino-esp32:LVGL中文字库(通用)

    发表评论