文章目录
- 一、介绍
- 二、用法
- 1、创建
- 2、显示文本
- 2.1 直接设置要显示的文本
- 2.2 格式化给定要显示的文本
- 2.3 在 label 中进行换行
- 3、改变字体大小
- 4、长模式
- 5、文本选择
- 6、文本对齐方式
- 7、非常长的文本
- 8、显示内置图标字体
- 9、事件处理
- 三、拓展
- 1、修改文本颜色
- 1.1 Palette(调色板)
- 1.2 代码示例
- 2、刷新 label 中的内容
- 3、中文显示
- 3.1 介绍
- 3.2 如何使用字体转换器
- 3.3 如何在 LVGL 中使用生成的字体
- 3.4 详细操作
- 3.5 其他
一、介绍
标签是⽤来显⽰⽂本的控件。
在盒⼦模型⾥⾯,标签的组成包括:
- LV_PART_MAIN 矩形部分 ( 盒⼦区域 ) 。 填充值可⽤于在⽂本和背景之间添加空间。
- LV_PART_SCROLLBAR 当要展⽰的⽂本⼤于部件的⼤⼩时,显⽰的滚动条部分。
- LV_PART_SELECTED 选中⽂本时,突出显⽰的部分。 label 只能使⽤ text_color 和 bg_color 样式属性。
二、用法
1、创建
创建标签:
lv_obj_t * label = lv_label_create(parent);
代码示例
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
}
在调用标签控件函数时,会默认显示盒子模型中的文本,并默认为 text,若要更加清晰的了解标签控件与盒子模型的关系,可以调用之前盒子模型相关函数来调整文本显示。
代码示例
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0); //设置控件的透明度为不透明
lv_obj_set_style_bg_color(label, lv_color_hex(0x9fce43), 0); //设置空间的本地样式演示为绿色
}
一开始初始化的标签控件是默认透明的,当我们给他设置透明度和本地样式颜色后,文本显示也会做出相应改变。(注意:若只设置了颜色不设置透明度,还是与第一个现象相同)
2、显示文本
创建了标签部件之后我们就可以设置⽂本来显⽰了,如果不设置要显⽰的⽂本,默认显⽰的⽂本内容是: text 。
2.1 直接设置要显示的文本
lv_label_set_text(label, "New text");
代码示例
//在主函数中调用此函数
void label_demo(void)
{
//char * label_str = "LjunG 666";
static char label_str[] = "LjunG 666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0); //设置控件的透明度为不透明
lv_obj_set_style_bg_color(label, lv_color_hex(0x9fce43), 0); //设置空间的本地样式演示为绿色
/* 显示文本的几种方式 */
//lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
//lv_label_set_text(label, "LjunG 666"); //可直接修改控件文本内容
lv_label_set_text_static(label, label_str); //这里的label_str需要按照4、5行的格式创建才生效
}
可见一开始初始化的 text 被修改成我们指定的文本,文本内容成功修改。
2.2 格式化给定要显示的文本
lv_label_set_text_fmt(label, “%s: %d”, “Value”, 15);
代码示例
//在主函数中调用此函数
void label_demo(void)
{
//char * label_str = "LjunG 666";
//static char label_str[] = "LjunG 666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0); //设置控件的透明度为不透明
lv_obj_set_style_bg_color(label, lv_color_hex(0x9fce43), 0); //设置空间的本地样式演示为绿色
/* 显示文本的几种方式 */
//lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
//lv_label_set_text(label, "LjunG 666"); //可直接修改控件文本内容
//lv_label_set_text_static(label, label_str); //这里的label_str需要按照4、5行的格式创建才生效
lv_label_set_text_fmt(label, "%s%s%d", "LjunG", " ", 666); //格式化要显示的文本
}
按照2.1的现象对文本进行格式化得到相同现象。
2.3 在 label 中进行换行
要在 label 换⾏⾮常简单,像 printf 函数那样使⽤ \n 即可:
lv_label_set_text(label, " line1\nline2\n\nline4 ");
代码示例
//在主函数中调用此函数
void label_demo(void)
{
//char * label_str = "LjunG 666";
//static char label_str[] = "LjunG 666";
static char label_str[] = "LjunG 666\n\n\n\n666"; //体验label换行
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0); //设置控件的透明度为不透明
lv_obj_set_style_bg_color(label, lv_color_hex(0x9fce43), 0); //设置空间的本地样式演示为绿色
/* 显示文本的几种方式 */
//lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
//lv_label_set_text(label, "LjunG 666"); //可直接修改控件文本内容
lv_label_set_text_static(label, label_str); //这里的label_str需要按照4、5行的格式创建才生效(如果第5行没有加static关键字则无法正常显示)
//lv_label_set_text_fmt(label, "%s%s%d", "LjunG", " ", 666); //格式化要显示的文本
}
在调用 \n 后成功换行并且再次显示数据,如图在换行时本地样式颜色会一直存在,因为标签控件也是遵循盒子模型。
3、改变字体大小
改变字体⼤⼩(字号)就是改变了字体的类型,不同的字体⼤⼩对应了不同的字体。也就是说同样的内容,如果你要显⽰两个不同⼤⼩的⽂字,那就需要有两个对应的字体共 lvgl 显⽰,这样就需要消耗两份不同的资源来保存,即使你要显⽰的内容是⼀样的,设置⽅法:
lv_obj_set_style_text_font();
lv_style_set_text_font();
文本大小参数
#define LV_FONT_MONTSERRAT_8 1
#define LV_FONT_MONTSERRAT_10 1
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 1
#define LV_FONT_MONTSERRAT_18 1
#define LV_FONT_MONTSERRAT_20 1
#define LV_FONT_MONTSERRAT_22 1
#define LV_FONT_MONTSERRAT_24 1
#define LV_FONT_MONTSERRAT_26 1
#define LV_FONT_MONTSERRAT_28 1
#define LV_FONT_MONTSERRAT_30 1
#define LV_FONT_MONTSERRAT_32 1
#define LV_FONT_MONTSERRAT_34 1
#define LV_FONT_MONTSERRAT_36 1
#define LV_FONT_MONTSERRAT_38 1
#define LV_FONT_MONTSERRAT_40 1
#define LV_FONT_MONTSERRAT_42 1
#define LV_FONT_MONTSERRAT_44 1
#define LV_FONT_MONTSERRAT_46 1
#define LV_FONT_MONTSERRAT_48 1
代码示例
//在主函数中调用此函数
void label_demo(void)
{
//char * label_str = "LjunG 666";
//static char label_str[] = "LjunG 666";
static char label_str[] = "LjunG 666\n\n\n\n666"; //体验label换行
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0); //设置控件的透明度为不透明
lv_obj_set_style_bg_color(label, lv_color_hex(0x9fce43), 0); //设置空间的本地样式演示为绿色
/* 显示文本的几种方式 */
//lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
//lv_label_set_text(label, "LjunG 666"); //可直接修改控件文本内容
lv_label_set_text_static(label, label_str); //这里的label_str需要按照4、5行的格式创建才生效
//lv_label_set_text_fmt(label, "%s%s%d", "LjunG", " ", 666); //格式化要显示的文本
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 //如果第5行没有加static关键字则无法正常显示
}
可见,成功将文本字体设置为最大数值,在调用该函数时,lv_font_montserrat_14 为默认文本大小(初始化文本大小)。
4、长模式
默认情况标签的⼤⼩会⾃动拓展成和⽂本⼀样的⼤⼩ (LV_SIZE_CONTENT) ,也可以像前⾯课程说到的⽅法显式设置宽⾼:
lv_obj_set_size
lv_obj_set_width
lv_obj_set_height
这样就可能出现⽂本的宽度或⾼度⼩于 label ⼤⼩的情况,这个时候就需要做⼀些调整,下⾯是⼏种可调整的模式:
- LV_LABEL_LONG_WRAP 如果有多个换⾏,并且如果⾼度为 LV_SIZE_CONTENT 或者⾜够⾼,那么⾼度会根据⽂本换⾏被⾃动扩展;否则⽂本将被剪掉。 ( 默认设置 )
- LV_LABEL_LONG_DOT 如果⽂本太⻓,就保持⼤⼩并在末尾写 3 个点
- LV_LABEL_LONG_SCROLL 如果⽂本⽐标签宽 ( 太⻓ ) ,则可以⽔平来回滚动显⽰它。如果它很⾼ ( 多个 \n 换⾏ ) ,可以垂直滚动。只滚动⼀个⽅向,⽔平滚动的优先级更⾼。
- LV_LABEL_LONG_SCROLL_CIRCULAR 如果⽂本⽐标签宽,则⽔平滚动它。如果它更⾼,就垂直滚动。只滚动⼀个⽅向,⽔平滚动的优先级更⾼。
- LV_LABEL_LONG_CLIP 剪掉超出标签范围外的⽂本部分。
代码示例
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG 6666666666\n66666666\n66666666\n66666666\n66666666\n66666666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
/* 长模式设置 */
//第二个参数为宽度,第三个参数为高度
lv_obj_set_size(label, LV_SIZE_CONTENT, LV_SIZE_CONTENT); //文本设置为弹性状况,会根据盒子模型,内容大文本大,内容小文本小
}
可见,标签大小自动配置成与文本大小一样。我们也可以调用其他几个参数看看现象:
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG 6666666666\n66666666\n66666666\n66666666\n66666666\n66666666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
/* 长模式设置 */
//第二个参数为宽度,第三个参数为高度
lv_obj_set_size(label, 200, 50); //文本宽度超过设置宽度时,会自动换行;换行后高度超过设置高度时,会被截断
}
可以看到数据显示并不完全,因为我们文本的高度超过了标签的高度,为了避免这种情况,我们可以调用其他参数:
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG 6666666666\n66666666\n66666666\n66666666\n66666666\n66666666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
/* 长模式设置 */
//第二个参数为宽度,第三个参数为高度
lv_obj_set_size(label, 200, 50); //文本宽度超过设置宽度时,会自动换行;换行后高度超过设置高度时,会被截断
lv_label_set_long_mode(label, LV_LABEL_LONG_DOT); //文本宽度超过设置宽度时,会自动换行;换行后高度超过设置高度时,会以...结尾
}
这样子后面超过的内容就会以…结束,看起来比较美观,但是如果我们想要看到后面的内容,则需要换其他参数:
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG 6666666666\n66666666\n66666666\n66666666\n66666666\n66666666";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
/* 长模式设置 */
//第二个参数为宽度,第三个参数为高度
lv_obj_set_size(label, 200, 50); //文本宽度超过设置宽度时,会自动换行;换行后高度超过设置高度时,会被截断
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL); //文本宽度超过设置宽度时,会水平来回滚动;高度超过设置高度,会垂直来回滚动,水平滚动优先级较大
//lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); //文本宽度超过设置宽度时,会水平滚动;高度超过设置高度,会垂直滚动,水平滚动优先级较大
}
成功观察到下面被截掉的数据,若此时设置宽度小于文本宽度,则会垂直滚动,若设置高度也小于文本高度,呈现的还是垂直滚动,因为垂直滚动优先级大。(14行、15行现象类似,只不过滚动时现象有点不同,这里就不做演示)
可以使⽤ lv_label_set_long_mode(label, LV_LABEL_LONG_…) 指定模式。
注意: LV_LABEL_LONG_DOT 是直接操作⽂本缓冲区以添加 / 删除点。如果使⽤ lv_label_set_text 和 lv_label_set_text_fmt 它们会分配⼀个单独的缓冲区,不会出问题。但是如果使⽤ lv_label_set_text_static 时我们传递给它的缓冲区必须是可写的。
以下面几行代码作比较为例:
char * label_str = "LjunG 666"; //代码段存在于栈中 是只读的(速度较快)
static char label_str[] = "LjunG 666"; //代码段存在于栈中 涉及内存复制操作 可以对其进行复制粘贴到我们规划的栈中
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(效率快)
lv_label_set_text_static(label, label_str); //这里的label_str需要按照1、2行的格式创建才生效(效率慢)
5、文本选择
如果在 lv_conf.h 中打开了 LV_LABEL_TEXT_SELECTION ,那么就可以使⽤ lv_label 的选择⽂本功能,这就像在 PC 上使⽤⿏标选择⽂本类似(在拖动⼿指 / ⿏标时单击并选择⽂本),不同的是 lv_label 只能⼿动指定要选择的⽂本范围:
- lv_label_set_text_selection_start();
- lv_label_set_text_selection_end();
代码示例
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG 666"; //代码段存在于栈中 涉及内存复制操作 可以对其进行复制粘贴到我们规划的栈中
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
/* 文本选择 */
lv_label_set_text_selection_start(label, 0); //从设定文本的0开始
lv_label_set_text_selection_end(label, 5); //在设定文本的5结束
}
可以看到被选中的文本会出现白色背景,就实现了文本选择。
6、文本对齐方式
函数接口:
lv_obj_set_style_text_align();
lv_style_set_text_align();
注意,只有在以下情况下,它才具有可见的效果:
- lv_label 的宽度⼤于⽂本最长行的宽度
- ⽂本有多⾏并且⾏⻓度不相等
代码示例
//在主函数中调用此函数
void label_demo(void)
{
static char label_str[] = "LjunG\n66666666666\n666666666\n6666666\n66666\n666\n6";
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, label_str); //需要先创建label_str指定文本内容(对应第4、5行)
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
/* 文本对齐 */
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
}
可以看到,在我们设定的文本中,按居中方式进行对齐。
7、非常长的文本
如果⽂本⾮常⻓(⽐如 > 40k 个字符)时, lv_label 可能会⽆法处理甚⾄报错或者展⽰起来效果⾮常差,那么想要有效地处理这些⽂本,需要在 lv_conf.h
中打开 LV_LABEL_LONG_TXT_HINT
。
8、显示内置图标字体
通过⼀些⽅法我们可以将想要的图标集成到字体⽂件中,之后通过字体的形式进⾏显示,⽐如使⽤ lv_label 显示。
用法很简单:
lv_label_set_text(my_label, LV_SYMBOL_OK); // 直接显示图标
lv_label_set_text(my_label, LV_SYMBOL_OK “Apply”); // 图标与字符串一起使用
lv_label_set_text(my_label, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY); // 多个图标一起使用
代码示例
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, LV_SYMBOL_AUDIO LV_SYMBOL_LEFT "LjunG 666" LV_SYMBOL_RIGHT LV_SYMBOL_AUDIO);
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
}
可见,按照用法第三行可以实现多个图标一起使用,同时在图标中加入文本。
9、事件处理
lv_label 默认不接收输⼊事件,如果我们想让 lv_label 响应点击操作,需要打开 LV_OBJ_FLAG_CLICKABLE ,⽰例:
lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE); // 使输入设备可点击对象
代码示例
static void my_event_cb(lv_event_t * e);
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(label, my_event_cb, LV_EVENT_CLICKED, label);
/* 显示文本的几种方式 */
lv_label_set_text(label, LV_SYMBOL_AUDIO LV_SYMBOL_LEFT "LjunG 666" LV_SYMBOL_RIGHT LV_SYMBOL_AUDIO);
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
}
static void my_event_cb(lv_event_t * e)
{
LV_LOG_USER(">>>>>>>>>>>>LV_EVENT_CLICKED\n");
}
可以看到,当我们设置了输入设备可点击,在点击 label 文本时,成功打印出信息,即让 label 响应点击操作。
三、拓展
1、修改文本颜色
颜色模块处理所有与颜色相关的功能,如改变颜色深度、从十六进制代码创建颜色、在颜色深度之间转换、混合颜色等。
类型 lv_color_t
用于以RGB888格式存储颜色。无论 LV_COLOR_DEPTH 如何,几乎所有 API 中都使用此类型和格式。
从红色、绿色和蓝色通道值创建颜色:
/*All channels are 0-255*/
lv_color_t c = lv_color_make(red, green, blue);
/*Same but can be used for const initialization too */
lv_color_t c = LV_COLOR_MAKE(red, green, blue);
/*From hex code 0x000000..0xFFFFFF interpreted as RED + GREEN + BLUE*/
lv_color_t c = lv_color_hex(0x123456);
/*From 3 digits. Same as lv_color_hex(0x112233)*/
lv_color_t c = lv_color_hex3(0x123);
1.1 Palette(调色板)
LVGL中包含 Material Design’s palette 的颜色。在这个系统中,所有命名的颜色都有一个名义上的主要颜色,以及四种较暗和五种较浅的变体。
颜色的名称如下:
LV_PALETTE_RED
LV_PALETTE_PINK
LV_PALETTE_PURPLE
LV_PALETTE_DEEP_PURPLE
LV_PALETTE_INDIGO
LV_PALETTE_BLUE
LV_PALETTE_LIGHT_BLUE
LV_PALETTE_CYAN
LV_PALETTE_TEAL
LV_PALETTE_GREEN
LV_PALETTE_LIGHT_GREEN
LV_PALETTE_LIME
LV_PALETTE_YELLOW
LV_PALETTE_AMBER
LV_PALETTE_ORANGE
LV_PALETTE_DEEP_ORANGE
LV_PALETTE_BROWN
LV_PALETTE_BLUE_GREY
LV_PALETTE_GREY
要获取主要颜色,请使用 lv_color_t c = lv_palette_main(LV_PALETTE_...)
1.2 代码示例
改变文本全部字体
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, LV_SYMBOL_AUDIO LV_SYMBOL_LEFT "LjunG 666" LV_SYMBOL_RIGHT LV_SYMBOL_AUDIO);
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
/* 改变文本颜色(所有) */
lv_obj_set_style_text_color(label, lv_color_make(128, 0, 128), 0); //使用RGB三原色显示颜色
//lv_obj_set_style_text_color(label, lv_color_hex(0x800080), 0); //以16进制显示颜色
//lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_PURPLE), 0);//以主要颜色显示
}
可见,我们写入的文本所有字体颜色都发生变化。
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, LV_SYMBOL_AUDIO LV_SYMBOL_LEFT "LjunG 666" LV_SYMBOL_RIGHT LV_SYMBOL_AUDIO);
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
/* 文本选择 */
lv_label_set_text_selection_start(label, 0); //从设定文本的0开始
lv_label_set_text_selection_end(label, 5); //在设定文本的5结束
/* 改变指定文本颜色 */
lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_PURPLE), LV_PART_SELECTED); //在设定的文本设置颜色
lv_obj_set_style_bg_color(label, lv_color_hex(0xf5f5f5), LV_PART_SELECTED); //在设定的文本设置背景色(如果执行此条指令,则在上一条指令执行文本改变颜色后其背景色为白色,与软件背景色有差异)
}
可以看到我们写入的文本在设定的文本范围内颜色发生了改变。
2、刷新 label 中的内容
可以创建一个定时器,定时器回调函数中随机显示 label 文本,在主函数调用即可。
代码示例
//在主函数中调用此函数
void label_demo(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
/* 显示文本的几种方式 */
lv_label_set_text(label, LV_SYMBOL_AUDIO LV_SYMBOL_LEFT "LjunG 666" LV_SYMBOL_RIGHT LV_SYMBOL_AUDIO);
lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0); //设置文本大小 默认是lv_font_montserrat_14
/* 文本选择 */
lv_label_set_text_selection_start(label, 0); //从设定文本的0开始
lv_label_set_text_selection_end(label, 5); //在设定文本的5结束
/* 改变指定文本颜色 */
lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_PURPLE), LV_PART_SELECTED); //在设定的文本设置颜色
lv_obj_set_style_bg_color(label, lv_color_hex(0xf5f5f5), LV_PART_SELECTED); //在设定的文本设置背景色(如果执行此条指令,则在上一条指令执行文本改变颜色后其背景色为白色,与软件背景色有差异)
lv_timer_t * timer1;
timer1 = lv_timer_create(my_timer1, 100, label); //创建timer1,100ms调用一次,同时获取label的内容
}
static void my_timer1(lv_timer_t * timer)
{
lv_obj_t *label = (lv_obj_t *)lv_timer_get_user_data(timer);\
lv_label_set_text_fmt(label, "%d,%d%%", lv_rand(20, 30), lv_rand(70, 80)); //第一个参数在20-30间随机跳动 第二个参数在70-80间随机跳动
}
可以看见一开始设置的文本被定时器中设置的文本替代,并随机调动数值,内容得到刷新。
3、中文显示
3.1 介绍
LVGL 内置有⼀个可以显⽰某些中⽂字符的字库 CJK 字库 我们可以直接使⽤,这个字库在 lv_conf.h
中定义为: LV_FONT_SIMSUN_16_CJK
( \lvgl\src\font\lv_font_simsun_16_cjk.c )。
不难发现,打开宏定义后只能使用 LVGL 字库内的部分字体。
如果要在 lvgl 中使⽤显⽰⾃⼰的中⽂字库,我们需要⽤到两个东西:字体⽂件和字体转换器。
字体⽂件我们可以使⽤开源的字体或者⾃⼰制作出来,准备好了字体⽂件之后使⽤字体转换器即可转换成可以在 lvgl 上使⽤的字体格式。开源字体获取⻚⾯: https://lvgl.100ask.net/master/extra/fonts-zh-source.html
准备好字体⽂件之后就可以通过 lvgl 官⽅提供的字体转换器,提取转换你想要的字体, LVGL 官⽅在线字体转换器页面: https://lvgl.io/tools/fontconverter
3.2 如何使用字体转换器
- 为要输出字体命名。例如 “lv_font_source_han_sans_bold_20”
- 以 px 为单位指定⾼度(字体⼤⼩)
- 设置 bpp (bit-per-piel) 。值越⾼,字体越平滑(抗锯⻮)
- 选择 TTF 或 WOFF 格式字体⽂件
- 设置要包含在字体中的 Unicode 字符范围或在符号字段中列出字符
- 可以同时选择多个字体⽂件转换,并为其指定范围和 / 或符号。这些字符将被合并转换到同⼀个⽂件中
- 单击转换按钮以下载转换出来的 font_source_han_sans_bold_20.c ⽂件
Fallback 选项是备⽤字体,如果当前的字体⽆法找到字符时, lvgl 会尝试使⽤备选⽅案,如果备选⽅案中有⾃ ⼰的的备选⽅案,那么如果条件符合会继续使⽤备选⽅案,直到没有设置 fallback 为⽌。
⽂档阅读: https://lvgl.100ask.net/9.1/overview/font.html#use-font-fallback
3.3 如何在 LVGL 中使用生成的字体
-
将结果 C ⽂件复制到你的 LVGL 项⽬中,并包含到项⽬;
-
在你的项⽬应⽤程序的 C ⽂件中,将字体声明为:
// 这样声明 extern lv_font_t my_font_name; // 或者这样声明 LV_FONT_DECLARE(my_font_name);
-
通过样式中设置字体:
lv_style_set_text_font(&style_obj, &my_font_name); // 普通(共享)样式 lv_obj_set_style_text_font(label, &my_font_name, 0); // 私有(本地)样式
unicode 是统⼀所有语⾔的⼀套编码。
utf-8 是基于 unicode 编码的⼀种节约字节的编码。
3.4 详细操作
打开上面的官网 https://lvgl.100ask.net/master/extra/fonts-zh-source.html ,操作如下:
下载时可能会出现无法安全下载字体,可以选择保留即可正常下载:
下载完毕后会得到一个压缩包,将其放在我们的工程文件目录下即可:
此时我们已经将字体文件准备完毕,接着打开字体转换器网站 https://lvgl.io/tools/fontconverter 设置相关需求字体并提取:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
提交后可得到一个.c文件,将其放在工程文件目录下:
后面的操作就只需要在代码文件中做出相应修改即可正常显示我们所需要的字体:
static void my_event_cb(lv_event_t * e);
static void my_timer1(lv_timer_t * timer);
void lesson_3_1_1(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active()); //创建label控件 会默认显示text
//lv_obj_set_style_text_font(label, &lv_font_simsun_16_cjk, 0);
lv_obj_set_style_text_font(label, &lv_font_source_han_sans_bold_28, 0);
lv_timer_t * timer1;
timer1 = lv_timer_create(my_timer1, 100, label); //创建timer1,100ms调用一次,同时获取label的内容
}
static void my_timer1(lv_timer_t * timer)
{
lv_obj_t *label = (lv_obj_t *)lv_timer_get_user_data(timer);
//lv_label_set_text(label, "80, 90%");
lv_label_set_text_fmt(label, "温度:%d,湿度:%d%%", lv_rand(20, 30), lv_rand(70, 80)); //第一个参数在20-30间随机跳动 第二个参数在70-80间随机跳动
//LV_LOG_USER("my_timer1 user_data: %d, idle: %d", *user_data, idle);
}
修改完相关配置就可以正常显示字体。
3.5 其他
-
⽤于提取指定字符的 Unicode 编码⼯具: https://unicode-table.com
-
Unicode 范围: http://jrgraphix.net/research/unicode.php
-
像素完美字体([等宽字体](等宽字体_百度百科 (baidu.com))): [Terminus](terminus-font download | SourceForge.net)
-
LVGL 内置字符列表( lv_font_simsun_16_cjk.c ),使⽤的字体是 FontAwesome:
61441,61448,61451,61452,61452,61453,61457,61459,61461,61465, 61468,61473,61478,61479,61480,61502,61512,61515,61516,61517, 61521,61522,61523,61524,61543,61544,61550,61552,61553,61556, 61559,61560,61561,61563,61587,61589,61636,61637,61639,61671, 61674,61683,61724,61732,61787,61931,62016,62017,62018,62019, 62020,62087,62099,62212,62189,62810,63426,63650
-
要了解有关 LVGL 字体处理的更多信息,请阅读这个指南
-
要脱离 LVGL 使⽤字体引擎,可以从这⾥开始: lv_font.c/h 、lv_font_fmt_txt.c/h
转换器的离线版本可在 [GitHub](GitHub - lvgl/lv_font_conv: Converts TTF/WOFF fonts to compact bitmap format) 上[获取](GitHub - lvgl/lv_font_conv: Converts TTF/WOFF fonts to compact bitmap format)