3-1-1_标签控件(lv_label)的用法

标签控件(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_SCROLLLV_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);  	 // 使输入设备可点击对象

课后思考

  1. 如何改变label中文本的颜色?
  2. 如何刷新(实时、定时)label中的内容?(比如:温、湿度数据)
  3. 下面示例中,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的配置:

文档位置