标签控件(lv_label)的用法
介绍
标签是用来显示文本的控件。
在盒子模型里面,标签的组成包括:
- LV_PART_MAIN 矩形部分(盒子区域)。 填充值可用于在文本和背景之间添加空间。
- LV_PART_SCROLLBAR 当要展示的文本大于部件的大小时,显示的滚动条部分。
- LV_PART_SELECTED 选中文本时,突出显示的部分。label只能使用 text_color 和 bg_color 样式属性。
用法
创建
创建标签:
lv_obj_t * label = lv_label_create(parent);
显示文本
创建了标签部件之后我们就可以设置文本来显示了,如果不设置要显示的文本,默认显示的文本内容是:text。
- 直接设置要显示的文本:
lv_label_set_text(label, "New text");
- 格式化给定要显示的文本:
lv_label_set_text_fmt(label, “%s: %d”, “Value”, 15);
- 文本不存储在动态内存中,而是直接使用给定的缓冲区:
lv_label_set_text_static(label, "New text");
- 要在label换行非常简单,像printf函数那样使用 \n 即可:
lv_label_set_text(label, " line1\nline2\n\nline4 ");
改变字体大小
改变字体大小(字号)就是改变了字体的类型,不同的字体大小对应了不同的字体。也就是说同样的内容,如果你要显示两个不同大小的文字,那就需要有两个对应的字体共lvgl显示,这样就需要消耗两份不同的资源来保存,即使你要显示的内容是一样的,设置方法:
lv_obj_set_style_text_font();
lv_style_set_text_font();
长模式
默认情况标签的大小会自动拓展成和文本一样的大小(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 剪掉超出标签范围外的文本部分。
可以使用 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 时我们传递给它的缓冲区必须是可写的。
文本选择
如果在 lv_conf.h 中打开了 LV_LABEL_TEXT_SELECTION ,那么就可以使用 lv_label 的选择文本功能,这就像在 PC 上使用鼠标选择文本类似(在拖动手指/鼠标时单击并选择文本),不同的是lv_label 只能手动指定要选择的文本范围:
- lv_label_get_text_selection_start(label, start_char_index);
- lv_label_get_text_selection_start(label, end_char_index);
文本对齐方式
函数接口:
lv_obj_set_style_text_align();
lv_style_set_text_align();
注意,只有在以下情况下,它才具有可见的效果。
- lv_label的宽度大于文本最长行的宽度
- 文本有多行并且行长度不相等
非常长的文本
如果文本非常长(比如 > 40k 个字符)时,lv_label可能会无法处理甚至报错或者展示起来效果非常差,那么想要有效地处理这些文本,需要在 lv_conf.h 中打开 LV_LABEL_LONG_TXT_HINT。
自定滚动动画
滚动动画可以通过设置样式(在长模式下 LV_LABEL_LONG_SCROLL
和 LV_LABEL_LONG_SCROLL_CIRCULAR
)。
设置animation 属性进行自定义,使用接口 lv_style_set_anim()。
显示LVGL内置的图标字体(SYMBOLS)
通过一些方法我们可以将想要的图标集成到字体文件中,之后通过字体的形式进行显示,比如使用lv_label显示。LVGL库内置了一些图标字体提供给开发者使用:https://lvgl.100ask.net/9.1/overview/font.html
用法很简单(LV_SYMBOL_...):
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); // 多个图标一起使用
事件处理
lv_label默认不接收输入事件,如果我们想让lv_label响应点击操作,需要打开 LV_OBJ_FLAG_CLICKABLE,示例:
lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE); // 使输入设备可点击对象
课后思考
- 如何改变label中文本的颜色?
- 如何刷新(实时、定时)label中的内容?(比如:温、湿度数据)
- 下面示例中,char * text 指针保存在栈空间,当该函数退出之后栈空间就被回收了。为什么用 lv_label_set_text_static 能将内容显示出来呢?
void label_text(void)
{
char * text = "www.100ask.net";
lv_obj_t * label = lv_label_create(lv_screen_active());
lv_label_set_text_static(label, text);
}
欢迎加入讨论:
- QQ技术交流群(如群满,请加qq:401684796 验证备注:LVGL):774083288
- 微信交流群:添加微信: baiwenkeji_fae 验证备注:LVGL
无法显示中文?
显示中文需要将代码文件的编码设置为 utf-8
编码格式,使用IDE就需要在中进行设置,下面是Code::Blocks的配置: