4. 创建标签并动态更新文本
任务说明
本案例在LVGL中创建一个标签(Label),并演示两种动态更新文本的方式:通过按钮点击更新,以及通过定时器周期性更新。最终效果为:屏幕中央显示一个标签,标签下方有一个按钮,点击按钮立即更新标签文本;同时定时器每2秒自动切换标签文本内容。
实现方案
使用LVGL的lv_label_set_text()接口更新标签内容。按钮通过事件回调触发文本更新;定时器通过lv_timer_create()创建,在回调中切换文本。为区分两种更新来源,按钮更新时文本带“点击”前缀,定时器更新时文本带“定时”前缀,并附带递增序号。
完整代码
#include "lvgl.h"
static int btn_count = 0;
static int timer_count = 0;
static lv_obj_t *label;
/* 按钮事件回调 */
static void btn_event_cb(lv_event_t *e)
{
char buf[32];
btn_count++;
lv_snprintf(buf, sizeof(buf), "按钮点击 #%d", btn_count);
lv_label_set_text(label, buf);
}
/* 定时器回调 */
static void timer_cb(lv_timer_t *timer)
{
char buf[32];
timer_count++;
lv_snprintf(buf, sizeof(buf), "定时更新 #%d", timer_count);
lv_label_set_text(label, buf);
}
void label_demo_create(void)
{
/* 创建标签 */
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "初始文本");
lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);
lv_obj_center(label);
/* 创建按钮 */
lv_obj_t *btn = lv_btn_create(lv_scr_act());
lv_obj_set_size(btn, 120, 40);
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 60);
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t *btn_label = lv_label_create(btn);
lv_label_set_text(btn_label, "点击更新");
lv_obj_center(btn_label);
/* 创建定时器,周期2000ms */
lv_timer_create(timer_cb, 2000, NULL);
}
关键实现说明
- 标签创建:
lv_label_create()创建标签,lv_label_set_text()设置初始文本,lv_obj_center()使其居中。 - 按钮更新:按钮绑定
LV_EVENT_CLICKED事件,回调中拼接字符串并调用lv_label_set_text()更新标签。 - 定时器更新:
lv_timer_create()创建周期为2000ms的定时器,回调中同样更新标签文本。 - 文本缓冲区:使用
lv_snprintf()安全格式化字符串,避免缓冲区溢出。
SVG:标签更新机制示意
编译与运行
本代码基于LVGL v8.x版本。在已有LVGL移植工程中,将label_demo_create()加入初始化流程,确保LVGL的lv_tick_inc()和lv_timer_handler()在周期任务中正常调用。
int main(void)
{
lv_init();
/* 初始化显示驱动与输入驱动 */
// ...
label_demo_create();
while(1) {
lv_timer_handler();
lv_tick_inc(1); /* 根据实际tick周期调整 */
/* 延时若干ms */
}
}
验证方法
- 初始状态:屏幕中央显示“初始文本”,按钮位于标签下方。
- 按钮更新验证:点击按钮,标签立即变为“按钮点击 #1”,再次点击变为“按钮点击 #2”,序号递增。
- 定时器更新验证:不操作按钮,观察标签每2秒自动切换为“定时更新 #1”、“定时更新 #2”等。
- 判定标准:两种更新源均能正确修改标签文本,且序号连续递增,无卡顿或崩溃,即判定通过。