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())即可将按钮添加到当前屏幕。编译烧录后,观察屏幕中央的蓝色按钮。首次点击按钮,按钮背景变为红色,文本变为“点击了!”;再次点击,按钮恢复蓝色背景和“按钮”文本。每次点击都应产生一次状态切换,且按钮外观变化即时生效。

按钮点击事件状态切换 初始状态 按钮 背景色: #2196F3 文本: "按钮" is_clicked = false 点击 点击后状态 点击了! 背景色: #F44336 文本: "点击了!" is_clicked = true 每次点击触发 LV_EVENT_CLICKED 回调,切换状态

验证判定标准

程序运行后,屏幕中央出现蓝色按钮,文本为“按钮”。点击一次,按钮变为红色且文本变为“点击了!”;再点击一次,恢复为蓝色和“按钮”。连续多次点击,状态始终交替切换,无卡顿或显示异常,即可判定案例通过。若点击无响应或状态不切换,检查事件回调是否成功注册以及lv_event_get_target是否正确获取到按钮对象。