LVGL v8 基础标签(Baselabel)
lvsf_baselabel 是 SiFli 基于 LVGL v8 原生 lv_label 封装的自定义标签控件,在普通文本标签之上内建了一条数据驱动刷新通路:绑定数据源 id、注册数据回调并创建刷新定时器后,控件会周期性地拉取数据并更新自身文本,应用层无需自行轮询。它同时保留了 lv_label 的常规文本能力。
主要头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_baselabel.h
数据刷新通路相关接口:middleware/lvgl/lvsf/gui_widgets/lvsf_obj_ext.h
依赖控件:LVGL label(
LV_USE_LABEL)示例工程:example/multimedia/lvgl/lvgl_v8_baselabel
功能简介
继承自
lv_label_t,支持set_text、set_text_fmt、长文本模式、recolor 重着色、文本选择与编辑等全部常规标签能力。内建数据刷新通路:绑定数据源 id + 注册数据回调 + 创建刷新定时器,周期性拉取数据并自动刷新文本。
支持自定义文本(动态分配复制)、静态文本(仅保存指针,适用于常量字符串)。
支持静态字符串表(
sfat_str):添加、清除、按索引切换显示,适合周/月等枚举字符串。支持带省略号的文本截断(按显示宽度自动加
...)。支持格式化文本设置(
lv_baselabel_set_text_fmt)。
使用场景
实时数值显示,如运行时长、心率、电量、传感器读数等随时间变化的文本。
状态栏/表盘上跟随数据源自动刷新的数字。
需要在多个预定义字符串之间切换的标签(星期、月份、状态枚举)。
长文本按固定宽度截断并显示省略号的场景。
支持的开发板
sf32lb52-lcd_n16r8
sf32lb52-lchspi-ulp
配置与初始化
lvsf_baselabel 依赖 LVGL label 组件。在 menuconfig 中确认已开启:
CONFIG_LV_USE_LABEL=y
BSP 中通过 LVSF_USE_BASELABEL 宏控制该控件的编译。
创建对象的最小流程:
#include "lvsf_baselabel.h"
lv_obj_t *label = lv_baselabel_create(lv_scr_act());
lv_baselabel_set_text(label, "hello");
API 说明
回调类型
类型定义 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
基础标签刷新回调函数类型 |
|
创建与刷新
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
创建基础标签对象 |
|
|
刷新定时器回调 |
|
文本设置
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置自定义文本 |
|
|
使用格式化字符串设置文本 |
|
|
设置显示文本 |
直接调用底层 |
|
设置静态文本(不复制内容) |
仅保存指针,适用于常量字符串;文本生命周期须长于标签 |
|
设置长文本显示模式 |
|
|
启用/禁用颜色重绘 |
|
|
设置带省略号的文本 |
|
|
获取当前文本 |
返回指向文本内容的指针 |
文本选择与字符定位
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置文本选择起始位置 |
|
|
设置文本选择结束位置 |
|
|
获取文本选择起始位置 |
返回起始字符索引 |
|
获取文本选择结束位置 |
返回结束字符索引 |
|
获取长文本显示模式 |
返回当前长文本模式 |
|
获取颜色重绘状态 |
返回 |
|
获取指定字符的坐标 |
|
|
获取指定坐标处的字符索引 |
|
|
检查坐标处是否有字符 |
返回 |
|
在指定位置插入文本 |
|
|
剪切(删除)文本 |
|
静态字符串表(sfat_str)
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
添加静态字符串 |
|
|
清除所有静态字符串 |
释放全部已添加字符串内存并重置计数器 |
|
按索引选择并显示静态字符串 |
|
|
获取静态字符串数量 |
返回数量,0 表示尚未添加 |
|
获取当前显示的静态字符串索引 |
范围 0 到 |
典型用法
数据驱动刷新(推荐用法)
刷新定时器到点时会调用数据回调,在回调里把当前数据格式化进标签:
#include "lvsf_baselabel.h"
#include "lvsf_obj_ext.h" /* lv_obj_set_gmdata_cb / set_source_id / create_refresh_timer */
/* 数据回调:刷新定时器到点时被调用 */
static int32_t uptime_gmdata_cb(lv_obj_t *label, uint32_t *id_tab, uint8_t id_num)
{
(void)id_tab;
(void)id_num;
static uint32_t secs = 0;
secs++;
char buf[32];
lv_snprintf(buf, sizeof(buf), "uptime %02u:%02u",
(unsigned)((secs / 60) % 100), (unsigned)(secs % 60));
lv_baselabel_set_text(label, buf); /* 自己拼串 + set_text */
return 0;
}
void demo_baselabel_init(void)
{
lv_obj_t *label = lv_baselabel_create(lv_scr_act());
lv_obj_set_style_text_font(label, &lv_font_montserrat_36, 0);
lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_BLUE), 0);
lv_baselabel_set_text(label, "uptime 00:00"); /* 首次刷新前的初始文本 */
lv_obj_center(label);
/* 绑定数据源 + 回调 + 1 秒刷新定时器 */
static uint32_t source_id = 0x1105;
lv_obj_set_source_id(label, &source_id, 1);
lv_obj_set_gmdata_cb(label, uptime_gmdata_cb);
lv_obj_create_refresh_timer(label, 1000, lv_baselabel_refresh_timer);
lv_obj_refresh_start(label);
}
备注
在回调里更新文本,请用 lv_snprintf() 自己拼好字符串再调用 lv_baselabel_set_text()。lv_baselabel_set_text_fmt() 面向数据绑定格式串,并非普通 printf,直接传可变参数会得到错误结果。
静态字符串表切换
lv_baselabel_add_sfat_str(label, "Mon", 3);
lv_baselabel_add_sfat_str(label, "Tue", 3);
lv_baselabel_add_sfat_str(label, "Wed", 3);
lv_baselabel_select_sfat_str(label, 1); /* 显示 "Tue" */
效果展示
运行 lvgl_v8_baselabel example 可查看实际效果:屏幕中央显示蓝色大字 uptime 00:00,随后由刷新定时器每秒触发一次数据回调,标签自增为 00:01、00:02…… 文本变化完全由 baselabel 的数据刷新通路驱动。
参考文档
源码路径:
middleware/lvgl/lvsf/gui_widgets/lvsf_baselabel.h示例路径:
example/multimedia/lvgl/lvgl_v8_baselabel