016、LVGL事件类型与回调函数
LVGL事件类型与回调函数:从一次诡异的触摸失灵说起
上周调试一块基于ESP32-S3的智能家居面板,LVGL版本8.3.5,触摸屏用的是FT6336。界面跑起来一切正常,唯独点击某个按钮时,偶尔会触发两次回调,更诡异的是——有时候点击按钮A,回调里打印的却是按钮B的标签。排查了三天,最后发现是事件处理函数里顺手调了lv_obj_clean(),把事件源对象给清掉了,导致事件冒泡到了父容器。
这种坑,LVGL新手十有八九会踩。今天就把事件系统彻底拆开讲清楚。
事件驱动模型:LVGL不是轮询,是中断思维
LVGL的事件处理机制,本质上是一个注册-分发模型。每个对象(lv_obj_t)内部维护一个事件链表,当硬件事件(触摸、按键、编码器)或软件事件(值改变、滚动结束)发生时,LVGL的事件引擎会遍历这个链表,按优先级顺序调用注册的回调函数。
关键区别在于:LVGL的事件是异步触发的,但回调执行是同步的。这意味着你在回调里调lv_timer_handler()不会导致递归,但如果你在回调里删除了当前对象,后续的事件处理就会访问野指针。
事件类型:别只盯着LV_EVENT_CLICKED
LVGL定义了超过30种事件类型,但90%的场景只需要记住这几类:
输入设备相关:LV_EVENT_PRESSED(按下瞬间)、LV_EVENT_PRESSIN
