介绍:
LVGL 中的对象(widgets)可以接收多种类型的事件,这些事件可以由用户的输入动作触发,也可以由 LVGL 自身触发。事件处理是 LVGL 中一个非常重要的部分,因为它允许开发者响应用户与界面的互动。
事件的概念
在 LVGL 中,事件是指由用户操作(如触摸或按键)或系统操作(如对象状态的变化)引发的动作。这些事件可以通过注册回调函数来捕获,并且可以用来实现复杂的用户交互逻辑。
事件类型
LVGL 支持多种类型的事件,包括但不限于:
- Input Device Events:由输入设备触发的事件,如触摸屏或键盘。
- Drawing Events:由对象的绘图操作触发的事件。
- Special Events:特定于某种对象类型的事件。
常见的事件类型包括:
- LV_EVENT_PRESSED:当对象被按下时触发。
- LV_EVENT_RELEASED:当对象被释放时触发。
- LV_EVENT_CLICKED:当对象被点击时触发。
- LV_EVENT_LONG_PRESSED:当对象被长按时触发。
- LV_EVENT_LONG_PRESSED_REPEAT:当对象被持续长按时重复触发。
- LV_EVENT_SHORT_CLICKED:当对象被短按后立即释放时触发。
- LV_EVENT_VALUE_CHANGED:当对象的值发生变化时触发,适用于滑动条、选择器等。
- LV_EVENT_GESTURE:当检测到手势时触发。
- LV_EVENT_LEAVE:当光标离开对象时触发。
- LV_EVENT_ENTER:当光标进入对象时触发。
- LV_EVENT_SCROLL:当对象被滚动时触发。
注册事件处理程序
为了响应这些事件,你需要为对象注册事件处理程序。这通常是通过 lv_obj_add_event_cb() 函数完成的。这个函数接受以下参数:
- obj:要注册事件处理程序的对象。
- cb:事件处理函数。
- code:要响应的事件类型。
- user_data:传递给事件处理函数的用户数据。
事件冒泡
LVGL 还支持事件冒泡机制,即如果一个子对象接收到一个事件,而它的事件处理函数没有明确阻止冒泡,那么该事件将会传播给它的父对象,直到被某个对象的事件处理函数阻止。(会单独写一篇文章进行讲解)。
API:
添加事件
void lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t event_code, const void * user_data);
obj: 指向 LVGL 对象的指针,例如按钮、标签等。
event_cb: 事件处理函数的指针,当指定事件发生时会调用此函数。
event_code: 触发事件的代码,例如
LV_EVENT_CLICKED 或 LV_EVENT_VALUE_CHANGED。
user_data: 用于存储用户数据的指针,该数据会在事件触发时传递给事件处理函数
发送事件
void lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, const void * user_data);
obj: 指向 LVGL 对象的指针。
event_code: 要发送的事件代码。
user_data: 用户数据指针,可以用来传递额外的信息给处理函数
删除事件
void lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t event_code);
obj: 指向 LVGL 对象的指针。
event_cb: 要移除的事件处理函数的指针。
event_code: 与事件处理函数关联的事件代码
void lv_obj_remove_event_dsc(lv_obj_t * obj, const lv_event_dsc_t * event_dsc); //event dsc是Iv obj add event cb 返回的指针
obj: 指向 LVGL 对象的指针。
event_dsc: 事件描述符的指针,这是 lv_obj_add_event_cb 返回的值,用于唯一标识一个事件处理函数。
后面查看lvgl手册,回去重新整理笔记。
总结
LVGL 的事件系统允许你为各种对象注册不同的事件处理程序,从而实现丰富的用户交互功能。通过理解不同类型的事件和如何注册处理程序,你可以创建出更加动态和响应式的用户界面。
本文是基于韦东山老师的lvgl视频进行的学习笔记,如有侵权请联系。