292 字
1 分钟
lvgl中事件使用小技巧
lvgl中事件使用小技巧
lvgl中,一个对象(obj,例如一个button)点击后触发事件LV_EVENT_CLICKED
或LV_EVENT_SHORT_CLICKED
,当你按住移动到非当前对象所在区域时也会触发。
如何实现“按住后,移动到非当前对象位置后取消执行命令”?我使用了一个比较讨巧的做法(不去修改源码)。
lvgl事件中有一个事件是LV_EVENT_RELEASED
,它将在释放时触发。要实现上述的功能,我们可以做出这样的判断:当触发LV_EVENT_RELEASED
时,我去判断当前坐标是否在当前对象的范围内,如果在范围内我们就执行下面的代码,如果不在就不执行。
下面是示例代码:
#include "lvgl/lvgl.h"
static lv_obj_t * btn;
btn = lv_imgbtn_create(lv_disp_get_scr_act());
lv_obj_add_event_cb(btn, _btn_evt_handler, LV_EVENT_ALL, NULL);
static void event_handler(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * target = lv_event_get_target(e);
lv_event_code_t event = lv_event_get_code(e);
if (event == LV_EVENT_RELEASED) {
lv_indev_t* indev = lv_indev_get_act();
lv_point_t point = { 0 };
lv_indev_get_point(indev, &point); // 获取触控点的绝对坐标
// 打印触控点的坐标以便调试
SYS_LOG_INF("Touch point: %d, %d", point.x, point.y);
// 判断是否在该对象的坐标内
bool is_inside = lv_obj_hit_test(btn, &point);
if (is_inside){
myFunc();
}
}
}