踩坑指南02:LVGL添加内置字库


前言

  这几天想为LVGL添加汉字,在网上翻了很多教程,碰到一些坑,花了两天时间终于实现;本期为大家分享一下内置字库的添加方法,先上一张成果图:踩坑指南02:LVGL添加内置字库


一、准备好

大佬做的工具:LvglFontTool(v0.4)、Arduino IDE、支持C语言的编辑器(不需要编译功能)

二、原理简介

  内置字体库是将字体的位图数据,通过C语言的某种数据结构保存,并被编译器编译放进ROM里。
  因为下位机ROM通常很小,而且庞大的字体库会显著增加编译时间,所以不建议内置字体库放入所有常用汉字。

三、字*作

踩坑指南02:LVGL添加内置字库

1.选择字体

  打开LvglFontTool,新版本支持TTF字体包了;有字体包就勾选使用FreeType TTF,然后点击选择字体,选择字体包文件并设置大小,注意大小太小的话可能会乱码。
  不想用字体包就把勾去掉,点击选择字体就会变成挑选系统自带字体的界面,选好字体和字号即可。

2.添加文字

  选好字体后,就要添加内置字体库里需要的文字。我选择把程序要用到的字手动输进去,当然下面可以选加入常用汉字或所有汉字(不过我的芯片那点FLASH哪个都接受不了)。

3.导出文件

  输入字体名,包含先不改,然后点击开始转换,把生成的.C文件先找个地方放着。
  坑出现了:软件生成的文件名和字体名是相同的,但其实字体名和文件名没关系。前文说了,内置字体库是需要编译器编译的,哪个C语言编译器会管文件名叫啥,真正的字体名定义在.c文件内部,如果想改字体名,别只改个文件名哦。
  那么怎么查看和修改字体名呢?我们打开这个文件,直接看最后有这么一段:

//HYChenMeiZiW,,-1
//字模高度:43
//内部字体
//使用排序和二分查表
lv_font_t myfont1 = {
    .dsc = &font_dsc,
    .get_glyph_bitmap = __user_font_get_bitmap,
    .get_glyph_dsc = __user_font_get_glyph_dsc,
    .line_height = 43,
    .base_line = 0,
};

这里的myfont1就是字体名,想修改字体名来这里就好了

四.工程配置

  字体文件到位,那么接下来就要配置一下让lvgl接受它了。

1.放置字体文件、修改路径

  进入lvgl库文件夹,把字体文件放进/src/lv_font目录,打开文件,根据和lvgl.h文件的相对位置修改include路径:

#include "../../lvgl.h"

2.1 方案一:单文件配置

  个人比较喜欢这种方法,虽然每个文件都要声明字体,并到控件的样式中去调用,比较麻烦;但在多字体的情况下为不同控件分配字体非常简单。
  打开写有控件的c文件,在include下方添加字体声明:

LV_FONT_DECLARE(myfont1)	//myfont1是字体名

  添加声明后可以在该文件中调用这一字体,用样式(style)来选择和调用字体,举个栗子:

lv_style_init(&style);
//设置样式字体
lv_style_set_text_font(&style,LV_STATE_DEFAULT,&myfont1);
//应用样式
lv_obj_add_style(label,LV_LABEL_PART_MAIN,&style);

2.2 方案二:设为全局默认字体

  如果懒得一个一个设置,也可以简单粗暴地把字体设置为全局默认,这样所有控件都会使用这一字体
  在库文件夹中打开lvgl_conf.h文件,先声明字体(大概在420行左右位置,按注释寻找):

/* Optionally declare your custom fonts here.
 * You can use these fonts as default font too
 * and they will be available globally. E.g.
 * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \
 *                                LV_FONT_DECLARE(my_font_2)
 */
#define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(myfont1)

然后修改默认字体(只修改LV_THEME_DEFAULT_FONT_NORMAL这一项,其他都是文件自带的,不是手打的哦):

#define LV_THEME_DEFAULT_INCLUDE            <stdint.h>      /*Include a header for the init. function*/
#define LV_THEME_DEFAULT_INIT               lv_theme_material_init
#define LV_THEME_DEFAULT_COLOR_PRIMARY      lv_color_hex(0x01a2b1)
#define LV_THEME_DEFAULT_COLOR_SECONDARY    lv_color_hex(0x44d1b6)
#define LV_THEME_DEFAULT_FLAG               LV_THEME_MATERIAL_FLAG_LIGHT
#define LV_THEME_DEFAULT_FONT_SMALL         &lv_font_montserrat_14
#define LV_THEME_DEFAULT_FONT_NORMAL        &myfont1
#define LV_THEME_DEFAULT_FONT_SUBTITLE      &lv_font_montserrat_14
#define LV_THEME_DEFAULT_FONT_TITLE         &lv_font_montserrat_14

完成


END

上一篇:ABAP 弹窗弹出多个message


下一篇:getApplicationContext()、getBasecontext()、getApplication() 、getParent()