1.介绍

lv_label 标签控件可以说是 littleVGL 中使用最频繁的控件了,他的主要作用就是用来显示文本信息的,你可以在运行时的任何时候,使用lv_label_set_text(label, “New text”)接口来动态修改文本内容,littleVGL 内部会重新为这个标签重新分配堆空间,当然了你也可以通过lv_label_set_static_text(label, char_array)这样的接口来引用一个外部的char_array 文本指针,这样的好处就是 littleVGL 内部不会为这个文本内容分配堆空间,从而可以减少内存的使用,此标签控件支持换行,图标字体,部分文本重绘色等显示功能,同时针对长文本显示,它支持6种显示模式。

2. lv_label 的 API 接口

2.1 主要数据类型

2.1.1 长文本模式数据类型

enum {
LV_LABEL_LONG_EXPAND, //自动扩展对象的大小来包裹文本内容
//保持对象的宽度不变,当文本内容的宽度超过对象的宽度时会
//自动换行,然后同时自动扩展对象的高度来包裹文本内容的高度
LV_LABEL_LONG_BREAK,
//保持对象的大小不变,当文本内容太长显示不下时,
//会在文本末尾显示...三个点的省略号
LV_LABEL_LONG_DOT,
//保持对象的大小不变,当文本内容太长显示不下时,会自动循环向前向后滚动文本
LV_LABEL_LONG_SROLL,
//保持对象的大小不变,当文本内容太长显示不下时,会自动循环环形滚动文本
LV_LABEL_LONG_SROLL_CIRC,
LV_LABEL_LONG_CROP, //保持对象大小不变,超过的文本内容将会被剪切掉
};
typedef uint8_t lv_label_long_mode_t;

2.1.2 文本内容对齐数据类型

enum {
LV_LABEL_ALIGN_LEFT, //文本左对齐
LV_LABEL_ALIGN_CENTER, //文本居中对齐
LV_LABEL_ALIGN_RIGHT,//文本右对齐
};
typedef uint8_t lv_label_align_t;

2.1.3 标签样式数据类型

enum {
LV_LABEL_STYLE_MAIN,
};
typedef uint8_t lv_label_style_t;

2.2 API 接口

2.2.1 创建标签

lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy);

参数:
parent: 指向父对象
copy: 此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来
返回值:
返回新创建出来的标签对象,如果为 NULL 的话,说明堆空间不足了

2.2.2 设置动态文本(字符串形式)

void lv_label_set_text(lv_obj_t * label, const char * text);

参数:
label: 标签对象
text: 新的文本内容,文本内容要是’\0’空字符结尾,如果传 NULL 的话,那么代表刷新当前文本内容

2.2.3 设置动态文本(数组形式)

void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size);

参数:
label: 标签对象
array: 新的文本内容,不需要是’\0’空字符结尾,如果传 NULL 的话,那么代表刷新当前文本内容
size: 传入的 array 数组的大小,单位为字节

2.2.4 设置静态文本(字符串形式)

void lv_label_set_static_text(lv_obj_t * label, const char * text);

参数:
label: 标签对象
text: 新的文本内容,文本内容要是’\0’空字符结尾,如果传 NULL 的话,那么代表刷新当前文本内容

2.2.5 设置长文本模式

void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode);

参数:
label: 标签对象
long_mode: 长文本模式
如果不设置的话 , 那么标签对象的长文本模式默认为LV_LABEL_LONG_EXPAND

此处需要注意:lv_label_set_long_mode 的调用必须放在lv_obj_set_size 调用的前面,否则设置的宽和高是无效的,下面看个例子:
正确的方式:

lv_label_set_long_mode(label1,LV_LABEL_LONG_BREAK);
lv_obj_set_size(label1,100,0);//宽度为 100 像素,高度是无效的,随意设置吧
lv_label_set_text(label1,"Hello CSDN");

错误的方式:

lv_obj_set_size(label1,100,0);//宽度为 100 像素,高度是无效的,随意设置吧
lv_label_set_long_mode(label1,LV_LABEL_LONG_BREAK);
lv_label_set_text(label1,"Hello CSDN");

2.2.6 设置文本对齐方式

void lv_label_set_align(lv_obj_t * label, lv_label_align_t align);

参数:
label: 标签对象
align: 水平方向上的文本对齐方式
  记住,要想让标签的文本内容具有对齐的效果,那么必须得先保证标签对象具有指定的宽度,请看下面例子:

lv_obj_t *src = lv_scr_act();//获取屏幕对象
lv_obj_t *label1 = lv_label_create(src,NULL);//创建对象
lv_label_set_long_mode(label1,LV_LABEL_LONG_CROP);//设置长文本模式,不能设置为
//LV_LABEL_LONG_EXPAND 模式,因为其指定不了宽度
lv_obj_set_pos(label1,20,20);//设置坐标
lv_obj_set_size(label1,100,50);//设置宽和高
lv_label_set_text(label1,"Hello CSDN");//设置文本内容
lv_label_set_style(label1,LV_LABEL_STYLE_MAIN,&lv_style_plain_color);//设置具有背景色
lv_label_set_body_draw(label1,true);//设置绘制背景
lv_label_set_align(label1,LV_LABEL_ALIGN_CENTER);//设置文本居中对齐

2.2.7 是否使能文本重绘色功能

void lv_label_set_recolor(lv_obj_t * label, bool en);

参数:
label: 标签对象
en: 是否使能
使能之后,可以让标签的部分文本显示出不同的颜色,即一个标签里可以含有多种不同颜色的文本,这在其他的 GUI 库中,一般是办不到的,使用格式为: #十六进制颜色值 文本# ,注意了颜色值和文本之间至少得有一个空格,请看下面例子(只给出关键代码):

lv_label_set_recolor(label1,true);//先得使能文本重绘色功能
lv_label_set_text(label1,"#ff0000 red#,#00ff00 green#,#0000ff blue#");//使用了 3 次重绘色

还有一些比较简单的 API 接口,我这里就不列出来了,通过看函数名就能知道大概啥意思了。