《lvgl基础学习 —— switch》

1.lv_switch

  lv_switch 是 LVGL 中用于“二选一(ON / OFF)”的控件。

lv_switch的核心机制:

  lv_switch没有数值,只有状态。

LV_STATE_CHECKED   ← ON
(没有该状态)    ← OFF
也就是说:
ON = 有 LV_STATE_CHECKED
OFF = 没有 LV_STATE_CHECKED

最小使用步骤:

lv_obj_t *sw = lv_switch_create(parent);
lv_obj_center(sw);

/* 打开 */
lv_obj_add_state(sw, LV_STATE_CHECKED);

/* 关闭 */
lv_obj_clear_state(sw, LV_STATE_CHECKED);

 

demo:屏幕中央一个switch,默认OFF

#include "lvgl.h"

void ui_switch_demo(void)
{
    lv_obj_t *sw = lv_switch_create(lv_scr_act());
    lv_obj_center(sw);
}

 

获取switch状态:

bool on = lv_obj_has_state(sw, LV_STATE_CHECKED);

  true:ON   false:OFF

事件:

事件                        用途
LV_EVENT_VALUE_CHANGED     状态切换(最重要)
LV_EVENT_PRESSED           按下
LV_EVENT_RELEASED          松开

  永远用LV_EVENT_VALUE_CHANGED来判断开关

 

demo:切换switch,label显示on或者off

#include "lvgl.h"

static lv_obj_t *label;

static void switch_event_cb(lv_event_t *e)
{
    lv_obj_t *sw = lv_event_get_target(e);
    bool on = lv_obj_has_state(sw, LV_STATE_CHECKED);

    if(on)
        lv_label_set_text(label, "Switch: ON");
    else
        lv_label_set_text(label, "Switch: OFF");
}

void ui_switch_demo(void)
{
    /* 显示状态 */
    label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Switch: OFF");
    lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 30);

    /* Switch */
    lv_obj_t *sw = lv_switch_create(lv_scr_act());
    lv_obj_center(sw);

    lv_obj_add_event_cb(sw, switch_event_cb,
                        LV_EVENT_VALUE_CHANGED, NULL);
}

 

设置默认ON状态:

lv_obj_add_state(sw, LV_STATE_CHECKED);

 

设置默认OFF状态(创建完就是默认OFF):

lv_obj_clear_state(sw, LV_STATE_CHECKED);

 

禁用switch,不可点击:

lv_obj_add_state(sw, LV_STATE_DISABLED);

 

重新启用:

lv_obj_clear_state(sw, LV_STATE_DISABLED);

 

demo:自动曝光开关

static lv_obj_t *label;

static void ae_switch_cb(lv_event_t *e)
{
    lv_obj_t *sw = lv_event_get_target(e);
    bool on = lv_obj_has_state(sw, LV_STATE_CHECKED);

    if(on)
        lv_label_set_text(label, "Auto Exposure: ON");
    else
        lv_label_set_text(label, "Auto Exposure: OFF");

    /* 正确做法:
       通知 service 层,而不是直接操作 ISP */
}

void ui_switch_demo(void)
{
    label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Auto Exposure: OFF");
    lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 20);

    lv_obj_t *sw = lv_switch_create(lv_scr_act());
    lv_obj_align(sw, LV_ALIGN_CENTER, 0, 20);

    lv_obj_add_event_cb(sw, ae_switch_cb,
                        LV_EVENT_VALUE_CHANGED, NULL);
}

 

新手最常见的坑(一定要避)

❌ 1️⃣ 用 LV_EVENT_CLICKED 判断开关
→ 不严谨(拖动也会改变状态)

❌ 2️⃣ 用 lv_switch_get_state()
LVGL v8 没这个 API

❌ 3️⃣ 回调里直接 sleep / 操作硬件
→ UI 卡死

❌ 4️⃣ 多线程改 switch 状态
→ LVGL 非线程安全

 

posted @ 2025-12-19 09:45  一个不知道干嘛的小萌新  阅读(4)  评论(0)    收藏  举报