《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 非线程安全
浙公网安备 33010602011771号