前言
这几天想为LVGL添加汉字,在网上翻了很多教程,碰到一些坑,花了两天时间终于实现;本期为大家分享一下内置字库的添加方法,先上一张成果图:
一、准备好
大佬做的工具:LvglFontTool(v0.4)、Arduino IDE、支持C语言的编辑器(不需要编译功能)
二、原理简介
内置字体库是将字体的位图数据,通过C语言的某种数据结构保存,并被编译器编译放进ROM里。
因为下位机ROM通常很小,而且庞大的字体库会显著增加编译时间,所以不建议内置字体库放入所有常用汉字。
三、字*作
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
完成