nicad
292 字
1 分钟
lvgl中事件使用小技巧

lvgl中事件使用小技巧#

lvgl中,一个对象(obj,例如一个button)点击后触发事件LV_EVENT_CLICKEDLV_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();
        }
    }
}

lvgl中事件使用小技巧
https://nicad-blog.pages.dev/posts/lvgl事件的小技巧/
作者
nicad
发布于
2024-07-20
许可协议
CC BY-NC-SA 4.0