目录
- 一、概述
- 二、标签
- 1、设置文本
- 2、长模式
- 3、文本着色
- 4、文本选择
- 5、内置图标
- 6、事件
- 7、API 函数
一、概述
标签部件由三个部分组成:主体背景、滚动条和所选文本:
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、设置文本
设置标签部件文本的方法有三种:
- 调用
lv_label_set_text
函数
该函数是最常用的标签文本设置函数,它存储文本的内存由动态内存分配的。
- 调用
lv_label_set_text_fmt
函数
该函数与 C 语言的 sprintf
输出函数类似,都可以设置“式样化字符串”和“参数表”,示例代码如下:
lv_label_set_text_fmt(label, "Value: %d", 15);
- 调用
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、长模式
默认情况下,标签部件的宽度和高度都会根据文本的大小来动态变化。如果用户固定了标签部件的大小,并且文本的长度超过了部件的长度,则可以使用以下几个长文本模式来选择文本展现的形式:
LV_LABEL_LONG_WRAP
(默认):如果标签部件的高度是LV_SIZE_CONTENT
,则该部件高度将被扩展,否则文本将被剪切。LV_LABEL_LONG_DOT
:将标签文本右下角的最后 3 个字符替换为点。LV_LABEL_LONG_SCROLL
:来回滚动。如果文本比标签部件宽,则往水平方向滚动。如果文本比标签部件高,则往垂直方向滚动。注意:文本只会往一个方向滚动,水平方向具有更高的优先级。LV_LABEL_LONG_SCROLL_CIRCULAR
:循环滚动。如果文本比标签部件宽,则往水平方向滚动。如果文本比标签部件高,则往垂直方向滚动。注意:文本只会往一个方向滚动,水平方向具有更高的优先级。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_text
或lv_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、内置图标
- 直接显示图标
lv_label_set_text(lv_label1, LV_SYMBOL_OK);
- 与字符串一起使用
lv_label_set_text(lv_label1, LV_SYMBOL_OK "Apply");
- 许多个图标一起
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() | 从标签中删除字符。标签文本不能是静态的 |