static void bathtub_label_event_cb(lv_event_t *e) { // 添加按键声音 ui_tx_rd_with_buzz(); // 如果浴缸模式开关可以进入浴缸模式设置注水量 int bathtub_switch_state = lv_obj_has_state(bathtub_switch, LV_STATE_CHECKED); if (bathtub_switch_state == 1) { set_functions.bathtub_switch_state == 1; settings_save(); is_subpage_init = false; // 创建注水量设置页面 lv_obj_t *scene_page_parent = lv_obj_get_parent(scene_page); water_injection_page = lv_obj_create(scene_page_parent); // 注水量页面对象 // lv_obj_add_flag(scene_img, LV_OBJ_FLAG_HIDDEN); // 隐藏动画页面 lv_obj_remove_style_all(water_injection_page); lv_obj_set_style_bg_opa(water_injection_page, LV_OPA_COVER, NONE); // 背景颜色改为黑色 lv_obj_set_style_bg_color(water_injection_page, lv_color_make(NONE, NONE, NONE), NONE); // 背景颜色改为黑色 lv_obj_set_size(water_injection_page, 480, 1280); // 创建好浴缸模式注水量设置界面给系统发信号——15秒不退回主页面 if (water_injection_page != NULL) { set_return_flag(0); // 15秒不返回主页面 }
时间: 2025-06-27 15:09:15 浏览: 15
### 自定义事件回调函数在LVGL中的实现
在 LVGL 中,可以通过自定义事件回调函数来处理用户交互行为。对于浴缸模式开关及注水量设置页面逻辑的实现,可以利用 `lv_obj_set_event_cb` 或者更现代的方式使用 `lv_obj_add_event_cb` 来绑定对象与事件处理器。
以下是具体的实现方法:
#### 创建浴缸模式开关控件
浴缸模式开关可以使用滑动按钮 (`lv_switch`) 实现。当用户切换开关状态时,触发相应的事件并执行对应的逻辑操作。
```c
// 创建一个滑动开关用于控制浴缸模式
lv_obj_t *switch_mode = lv_switch_create(lv_scr_act());
lv_obj_align(switch_mode, LV_ALIGN_CENTER, 0, -50);
// 添加事件回调函数
lv_obj_add_event_cb(switch_mode, event_handler_bath_mode, LV_EVENT_VALUE_CHANGED, NULL);
```
#### 定义事件回调函数
事件回调函数负责捕获用户的输入动作,并根据具体的需求调整系统的响应逻辑。
```c
void event_handler_bath_mode(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
lv_obj_t *obj = lv_event_get_target(e); // 获取目标对象
if (code == LV_EVENT_VALUE_CHANGED) { // 如果检测到值改变
bool is_on = lv_switch_get_state(obj); // 判断当前开关的状态
if (is_on) {
// 执行开启浴缸模式的操作
printf("Bath mode ON\n");
} else {
// 执行关闭浴缸模式的操作
printf("Bath mode OFF\n");
}
}
}
```
上述代码实现了浴缸模式开关的功能[^1]。每当用户更改滑动开关的状态时,都会调用该回调函数以打印对应的消息。
#### 注水量设置功能
注水量设置可以借助旋钮组件 (`lv_knob`) 或滑块组件 (`lv_slider`) 来完成。这里我们采用滑块作为示例。
```c
// 创建一个滑块用于设定注水量
lv_obj_t *slider_water_level = lv_slider_create(lv_scr_act());
lv_obj_align(slider_water_level, LV_ALIGN_CENTER, 0, 50);
lv_slider_set_range(slider_water_level, 0, 100); // 设置范围为0至100%
// 绑定事件回调函数
lv_obj_add_event_cb(slider_water_level, event_handler_water_level, LV_EVENT_VALUE_CHANGED, NULL);
```
#### 处理注水量变化的事件
同样需要编写一个专门针对注水量变化的事件回调函数。
```c
void event_handler_water_level(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *obj = lv_event_get_target(e);
if (code == LV_EVENT_VALUE_CHANGED) {
int water_level = lv_slider_get_value(obj); // 获取当前滑块数值
printf("Water level set to %d%%\n", water_level);
// 可在此处加入其他业务逻辑,比如发送指令给硬件设备
}
}
```
以上代码展示了如何通过滑块动态调整注水量,并实时反馈当前设定值。
---
### 总结
通过结合 LVGL 的事件机制以及其丰富的 UI 控件库,可以轻松构建复杂的交互界面。本方案分别介绍了如何创建浴缸模式开关和注水量设置器,并为其配置了独立的事件监听器以便于扩展更多功能。
---
阅读全文
相关推荐


















