文章目录
- 🧱 一、什么是 LVGL 事件?
- 🎯 二、事件回调的注册
- 参数解释:
- 示例:
- 📚 三、常见事件类型(`lv_event_code_t`)
- ✅ 1. 输入类事件(用户交互)
- ✅ 2. 组件状态类事件
- ✅ 3. 生命周期类事件
- ✅ 4. 滚动与拖动类事件
- ⚙️ 四、事件回调函数结构
- 🧪 五、完整示例:按钮点击显示消息
- 🧠 六、LVGL 事件的高级用法
- ✅ 一次处理多个事件
- ✅ 使用用户数据传参
- 📌 总结
在 LVGL(Light and Versatile Graphics Library) 中,事件系统 是控件间交互的核心机制。它让你能响应按钮点击、滑动、值变化、焦点获取等各种行为。
我们来系统性地讲解:
🧱 一、什么是 LVGL 事件?
事件(lv_event_t
)是 LVGL 中 控件生命周期或用户操作引发的动作通知。
控件通过事件系统通知外部“某件事发生了”,我们通过注册回调函数处理这些事件,完成逻辑响应。
比如:
- 按钮被点击(点击事件)
- 滚动条滚动(值改变事件)
- 对象被删除(清理事件)
🎯 二、事件回调的注册
事件处理函数的注册使用 lv_obj_add_event_cb()
函数:
lv_obj_add_event_cb(obj, my_event_cb, LV_EVENT_CLICKED, user_data);
参数解释:
obj
:要监听的对象my_event_cb
:事件回调函数(函数指针)LV_EVENT_CLICKED
:要监听的事件类型user_data
:用户自定义数据指针,会传给回调(可为NULL
)
示例:
void my_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * target = lv_event_get_target(e);if (code == LV_EVENT_CLICKED) {printf("Button clicked!\n");}
}
📚 三、常见事件类型(lv_event_code_t
)
LVGL 的事件可以分为几类:
✅ 1. 输入类事件(用户交互)
事件宏 | 描述 |
---|---|
LV_EVENT_PRESSED | 用户按下对象(触摸/点击) |
LV_EVENT_PRESSING | 按住过程中 |
LV_EVENT_PRESS_LOST | 按住但滑出控件范围 |
LV_EVENT_RELEASED | 用户释放了对象 |
LV_EVENT_CLICKED | 完整的一次点击(按下+释放) |
LV_EVENT_LONG_PRESSED | 长按触发 |
LV_EVENT_LONG_PRESSED_REPEAT | 长按后重复触发 |
✅ 2. 组件状态类事件
事件宏 | 描述 |
---|---|
LV_EVENT_FOCUSED | 控件获取焦点 |
LV_EVENT_DEFOCUSED | 控件失去焦点 |
LV_EVENT_VALUE_CHANGED | 控件的值发生变化(如 slider) |
✅ 3. 生命周期类事件
事件宏 | 描述 |
---|---|
LV_EVENT_DRAW_MAIN_BEGIN/END | 绘制开始/结束(自定义绘制用) |
LV_EVENT_DELETE | 控件即将被删除 |
LV_EVENT_CHILD_CHANGED | 子对象添加/删除 |
✅ 4. 滚动与拖动类事件
事件宏 | 描述 |
---|---|
LV_EVENT_SCROLL_BEGIN | 开始滚动 |
LV_EVENT_SCROLL_END | 滚动停止 |
LV_EVENT_SCROLL | 正在滚动 |
LV_EVENT_SCROLL_DRAW_BEGIN/END | 滚动绘制开始/结束 |
⚙️ 四、事件回调函数结构
void my_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e); // 获取事件类型lv_obj_t * obj = lv_event_get_target(e); // 获取触发对象void * user_data = lv_event_get_user_data(e); // 获取用户数据if(code == LV_EVENT_CLICKED) {printf("Clicked: %s\n", lv_obj_get_style_text(obj, LV_PART_MAIN));}
}
🧪 五、完整示例:按钮点击显示消息
void btn_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * btn = lv_event_get_target(e);if(code == LV_EVENT_CLICKED) {printf("按钮被点击了!\n");lv_obj_t * label = lv_obj_get_child(btn, 0);lv_label_set_text(label, "已点击!");}
}void create_btn()
{lv_obj_t * btn = lv_btn_create(lv_scr_act());lv_obj_center(btn);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);
}
🧠 六、LVGL 事件的高级用法
✅ 一次处理多个事件
lv_obj_add_event_cb(obj, my_cb, LV_EVENT_ALL, NULL);
然后在 my_cb
里判断 code
即可。
✅ 使用用户数据传参
struct {int count;const char * msg;
} my_data = {0, "点击次数"};lv_obj_add_event_cb(obj, my_cb, LV_EVENT_CLICKED, &my_data);
在回调中获取:
void * data = lv_event_get_user_data(e);
📌 总结
LVGL 的事件系统 = 控件行为通知机制:
lv_obj_add_event_cb()
注册回调;lv_event_t
是事件容器;lv_event_get_code()
获取事件类型;- 支持交互、生命周期、绘图等多个事件维度;
- 能通过用户数据传递自定义信息。