4. 按钮控件与点击事件
任务说明
本案例在LVGL中创建一个按钮控件,为其绑定点击事件。当按钮被点击时,按钮文本在“点击了!”与“按钮”之间切换,同时背景色在蓝色与红色之间切换。通过该案例掌握LVGL控件创建、事件回调注册及控件属性更新的基本方法。
实现方案
使用LVGL的lv_btn_create创建按钮,通过lv_obj_add_event_cb注册点击事件回调。回调函数中通过lv_obj_set_style_bg_color修改背景色,通过lv_label_set_text修改按钮上标签文本。使用一个静态布尔变量记录当前状态,实现点击切换效果。
完整代码
#include "lvgl.h"
static bool is_clicked = false;
/* 点击事件回调函数 */
static void btn_event_cb(lv_event_t *e)
{
lv_obj_t *btn = lv_event_get_target(e);
lv_obj_t *label = lv_obj_get_child(btn, 0);
if (is_clicked) {
/* 恢复初始状态 */
lv_obj_set_style_bg_color(btn, lv_color_hex(0x2196F3), LV_STATE_DEFAULT);
lv_label_set_text(label, "按钮");
is_clicked = false;
} else {
/* 切换为点击状态 */
lv_obj_set_style_bg_color(btn, lv_color_hex(0xF44336), LV_STATE_DEFAULT);
lv_label_set_text(label, "点击了!");
is_clicked = true;
}
}
/* 按钮创建与事件绑定 */
void button_demo_create(lv_obj_t *parent)
{
/* 创建按钮 */
lv_obj_t *btn = lv_btn_create(parent);
lv_obj_set_size(btn, 160, 60);
lv_obj_center(btn);
/* 设置初始背景色为蓝色 */
lv_obj_set_style_bg_color(btn, lv_color_hex(0x2196F3), LV_STATE_DEFAULT);
/* 创建按钮上的标签 */
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text(label, "按钮");
lv_obj_center(label);
/* 绑定点击事件 */
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
}
代码说明
上述代码中,button_demo_create函数接收一个父对象指针,在其上创建按钮。按钮尺寸设为160×60像素并居中显示。初始背景色为蓝色(0x2196F3),标签文本为“按钮”。事件回调btn_event_cb通过lv_event_get_target获取被点击的按钮对象,再通过lv_obj_get_child(btn, 0)获取按钮上的第一个子对象(即标签)。静态变量is_clicked记录当前状态,每次点击后切换文本与背景色。
关键接口说明
lv_btn_create(parent):创建按钮控件,parent为父对象。lv_obj_add_event_cb(obj, cb, LV_EVENT_CLICKED, NULL):为按钮注册点击事件回调。lv_obj_set_style_bg_color(obj, color, LV_STATE_DEFAULT):设置控件背景色。lv_label_set_text(label, text):设置标签文本内容。
运行与验证
在LVGL初始化完成后,调用button_demo_create(lv_scr_act())即可将按钮添加到当前屏幕。编译烧录后,观察屏幕中央的蓝色按钮。首次点击按钮,按钮背景变为红色,文本变为“点击了!”;再次点击,按钮恢复蓝色背景和“按钮”文本。每次点击都应产生一次状态切换,且按钮外观变化即时生效。
验证判定标准
程序运行后,屏幕中央出现蓝色按钮,文本为“按钮”。点击一次,按钮变为红色且文本变为“点击了!”;再点击一次,恢复为蓝色和“按钮”。连续多次点击,状态始终交替切换,无卡顿或显示异常,即可判定案例通过。若点击无响应或状态不切换,检查事件回调是否成功注册以及lv_event_get_target是否正确获取到按钮对象。