LVGL 控件之标签(lv_label)


一、概述

标签部件由三个部分组成:主体背景、滚动条和所选文本:

  • LV_PART_MAIN(主体背景)使用所有典型的背景属性和文本属性。 填充值可用于在文本和背景之间添加空间。
  • LV_PART_SCROLLBAR(滚动条)当文本大于组件的大小时显示的滚动条。
  • LV_PART_SELECTED(所选文本)告诉 selected text 的样式。 只能使用 text_color 和 bg_color 样式属性。

下面是一个简单的标签示例:

lv_obj_t* lv_label1 = lv_label_create(lv_scr_act());
lv_label_set_text(lv_label1, "Hello World");
lv_obj_center(lv_label1);

二、标签

1、设置文本

设置标签部件文本的方法有三种:

  1. 调用 lv_label_set_text 函数

该函数是最常用的标签文本设置函数,它存储文本的内存由动态内存分配的。

  1. 调用 lv_label_set_text_fmt 函数

该函数与 C 语言的 sprintf 输出函数类似,都可以设置“式样化字符串”和“参数表”,示例代码如下:

lv_label_set_text_fmt(label, "Value: %d", 15);

  1. 调用 label_set_text_static 函数

该函数可以设置静态文本,该文本不存储在动态内存中,而是直接使用指定的缓冲区,此时,如果使用数组设置文本,则该数组不能是局部变量。

char *buf = "hello";

void my_gui(void)
{
    lv_obj_t* lv_label1 = lv_label_create(lv_scr_act());
    lv_label_set_text_static(lv_label1, buf);
    lv_obj_center(lv_label1);
}

在这里插入图片描述

当然也可用 ‘\n`’ 来进行换行:

lv_label_set_text(lv_label1, "Hello\nWorld\n!");

2、长模式

默认情况下,标签部件的宽度和高度都会根据文本的大小来动态变化。如果用户固定了标签部件的大小,并且文本的长度超过了部件的长度,则可以使用以下几个长文本模式来选择文本展现的形式:

  1. LV_LABEL_LONG_WRAP(默认):如果标签部件的高度是 LV_SIZE_CONTENT,则该部件高度将被扩展,否则文本将被剪切。
  2. LV_LABEL_LONG_DOT:将标签文本右下角的最后 3 个字符替换为点。
  3. LV_LABEL_LONG_SCROLL:来回滚动。如果文本比标签部件宽,则往水平方向滚动。如果文本比标签部件高,则往垂直方向滚动。注意:文本只会往一个方向滚动,水平方向具有更高的优先级。
  4. LV_LABEL_LONG_SCROLL_CIRCULAR:循环滚动。如果文本比标签部件宽,则往水平方向滚动。如果文本比标签部件高,则往垂直方向滚动。注意:文本只会往一个方向滚动,水平方向具有更高的优先级。
  5. LV_LABEL_LONG_CLIP:直接裁剪标签部件外面的文本。

用户可以使用 lv_label_set_long_mode(label, LV_LABEL_LONG_...) 指定长模式。

示例:

lv_obj_t* lv_label1 = lv_label_create(lv_scr_act());
lv_label_set_text(lv_label1, "Hello World dfadf dsfadsaf dsfadsf !");
lv_label_set_long_mode(lv_label1, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_content_width(lv_label1, 100);
lv_obj_center(lv_label1);

重要的是要注意,当创建标签并设置其文本时,标签的大小已扩展为文本大小。除了默认的 LV_LABEL_LONG_EXPAND ,长模式 lv_obj_set_width/height/size() 无效。

因此,需要更改长模式,首先设置新的长模式,然后使用 lv_obj_set_width/height/size() 设置大小。

另一个重要的注意事项是 LV_LABEL_LONG_DOT 在原地操纵文本缓冲区,以便添加/删除点。当使用 lv_label_set_textlv_label_set_array_text 时,将分配一个单独的缓冲区,并且该实现细节不会被注意。lv_label_set_static_text 并非如此!如果打算使用 LV_LABEL_LONG_DOT ,则传递给 lv_label_set_static_text 的缓冲区必须可写。

3、文本着色

用户需要让标签文本着色,可以调用 lv_label_set_recolor 函数。

lv_obj_t* lv_label1 = lv_label_create(lv_scr_act());
lv_label_set_text(lv_label1, "Hello #ff0000 World#!");
lv_label_set_recolor(lv_label1,true);
lv_obj_center(lv_label1);

注意:用户需要设置标签文本着色,必须按以下格式设置文本:#颜色 文本#

也可以通过样式改色:

lv_label_set_text(lv_label1, "Hello World!");
lv_obj_set_style_text_color(lv_label1, lv_color_hex(0xff0000), 0);

4、文本选择

如果在 lv_conf.h 中打开了 LV_LABEL_TEXT_SELECTION (默认开启),就可以选择部分文本了。这个和我们在 PC 用鼠标选中文本类似,但是这个效果只能在文本框 (lv_textarea) 中实现。Label 只能事先手动选择指定范围的文本

lv_label_get_text_selection_start(label, start_char_index);
lv_label_get_text_selection_start(label, end_char_index);

5、内置图标

  1. 直接显示图标
lv_label_set_text(lv_label1, LV_SYMBOL_OK);

在这里插入图片描述

  1. 与字符串一起使用
lv_label_set_text(lv_label1, LV_SYMBOL_OK "Apply");

  1. 许多个图标一起
lv_label_set_text(lv_label1, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY);

6、事件

Label 默认不接收输入事件,如果我们想设置输入类型的样式或者事件会无法生效,就需要打开 LV_OBJ_FLAG_CLICKABLE

lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(label, function, LV_EVENT_ALL, 0);

7、API 函数

函数描述
lv_label_create()创建标签对象
lv_label_set_text()设置标签的新文本
lv_label_set_text_fmt()设置标签的新格式的文本
lv_label_set_text_static()设置一个静态文本
lv_label_set_long_mode()使用更长的文本然后设置对象大小来设置标签
lv_label_set_recolor()启用重新着色
lv_label_set_text_sel_start()设置选择开始索引
lv_label_set_text_sel_end()设置选择结束索引
lv_label_get_text()获取标签文本
lv_label_get_long_mode()获取标签的长模式
lv_label_get_recolor()获取重新着色属性
lv_label_get_letter_pos()获取字母的相对 x 和 y 坐标
lv_label_get_letter_on()获取标签相对点上的字母索引
lv_label_is_char_under_pos()检查是否在一个点下绘制了一个字符
lv_label_get_text_selection_start()获取选择开始索引
lv_label_get_text_selection_end()获取选择结束索引
lv_label_ins_text()在标签上插入文本。标签文本不能是静态的
lv_label_cut_text()从标签中删除字符。标签文本不能是静态的
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值