lvgl手势事件判断为点击事件问题处理方法
1.打开文件lvgl\src\core\lv_indev.c
2. 修改函数
static void indev_proc_release(_lv_indev_proc_t * proc)
2.1 由原来的
/**
* Process the released state of LV_INDEV_TYPE_POINTER input devices
* @param proc pointer to an input device 'proc'
*/
static void indev_proc_release(_lv_indev_proc_t * proc)
{
if(proc->wait_until_release != 0) {
lv_event_send(proc->types.pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act);
if(indev_reset_check(proc)) return;
/*
* Actions:
* lv_indev_wait_release() will reset proc->types.pointer.last_obj,
* but keep scroll_throw_vect and scroll_obj, which may prevent searching
* another new scroll object (in indev_proc_press(), the scroll_dir will
* be reset, and scroll_obj kept, so find_scroll_obj() will not work).
*
* So stop the scroll throw here if any.
*/
proc->types.pointer.scroll_throw_vect.x = 0;
proc->types.pointer.scroll_throw_vect.y = 0;
proc->types.pointer.act_obj = NULL;
proc->types.pointer.last_obj = NULL;
proc->pr_timestamp = 0;
proc->longpr_rep_timestamp = 0;
proc->wait_until_release = 0;
}
indev_obj_act = proc->types.pointer.act_obj;
lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj;
/*Forget the act obj and send a released Call the ancestor's event handler*/
if(indev_obj_act) {
LV_LOG_INFO("released");
/*Send RELEASE Call the ancestor's event handler and event*/
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act);
if(indev_reset_check(proc)) return;
/*Send CLICK if no scrolling*/
if(scroll_obj == NULL) {
if(proc->long_pr_sent == 0) {
lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act);
if(indev_reset_check(proc)) return;
}
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act);
if(indev_reset_check(proc)) return;
}
proc->types.pointer.act_obj = NULL;
proc->pr_timestamp = 0;
proc->longpr_rep_timestamp = 0;
/*Get the transformed vector with this object*/
if(scroll_obj) {
int16_t angle = 0;
int16_t zoom = 256;
lv_point_t pivot = { 0, 0 };
lv_obj_t * parent = scroll_obj;
while(parent) {
angle += lv_obj_get_style_transform_angle(parent, 0);
zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256);
parent = lv_obj_get_parent(parent);
}
if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) {
angle = -angle;
zoom = (256 * 256) / zoom;
lv_point_transform(&proc->types.pointer.scroll_throw_vect, angle, zoom, &pivot);
lv_point_transform(&proc->types.pointer.scroll_throw_vect_ori, angle, zoom, &pivot);
}
}
}
/*The reset can be set in the Call the ancestor's event handler function.
* In case of reset query ignore the remaining parts.*/
if(scroll_obj) {
_lv_indev_scroll_throw_handler(proc);
if(indev_reset_check(proc)) return;
}
}
2.2 修改为
/**
* Process the released state of LV_INDEV_TYPE_POINTER input devices
* @param proc pointer to an input device 'proc'
*/
static void indev_proc_release(_lv_indev_proc_t * proc)
{
if(proc->wait_until_release != 0) {
lv_event_send(proc->types.pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act);
if(indev_reset_check(proc)) return;
/*
* Actions:
* lv_indev_wait_release() will reset proc->types.pointer.last_obj,
* but keep scroll_throw_vect and scroll_obj, which may prevent searching
* another new scroll object (in indev_proc_press(), the scroll_dir will
* be reset, and scroll_obj kept, so find_scroll_obj() will not work).
*
* So stop the scroll throw here if any.
*/
proc->types.pointer.scroll_throw_vect.x = 0;
proc->types.pointer.scroll_throw_vect.y = 0;
proc->types.pointer.act_obj = NULL;
proc->types.pointer.last_obj = NULL;
proc->pr_timestamp = 0;
proc->longpr_rep_timestamp = 0;
proc->wait_until_release = 0;
}
indev_obj_act = proc->types.pointer.act_obj;
lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj;
/*Forget the act obj and send a released Call the ancestor's event handler*/
if(indev_obj_act) {
LV_LOG_INFO("released");
/*Send RELEASE Call the ancestor's event handler and event*/
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act);
if(indev_reset_check(proc)) return;
/*Send CLICK if no scrolling*/
if(scroll_obj == NULL) {
if(proc->long_pr_sent == 0) {
lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act);
if(indev_reset_check(proc)) return;
}
lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_get_act());
if(dir == LV_DIR_NONE)
{
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act);
}
if(indev_reset_check(proc)) return;
}
proc->types.pointer.act_obj = NULL;
proc->pr_timestamp = 0;
proc->longpr_rep_timestamp = 0;
/*Get the transformed vector with this object*/
if(scroll_obj) {
int16_t angle = 0;
int16_t zoom = 256;
lv_point_t pivot = { 0, 0 };
lv_obj_t * parent = scroll_obj;
while(parent) {
angle += lv_obj_get_style_transform_angle(parent, 0);
zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256);
parent = lv_obj_get_parent(parent);
}
if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) {
angle = -angle;
zoom = (256 * 256) / zoom;
lv_point_transform(&proc->types.pointer.scroll_throw_vect, angle, zoom, &pivot);
lv_point_transform(&proc->types.pointer.scroll_throw_vect_ori, angle, zoom, &pivot);
}
}
}
/*The reset can be set in the Call the ancestor's event handler function.
* In case of reset query ignore the remaining parts.*/
if(scroll_obj) {
_lv_indev_scroll_throw_handler(proc);
if(indev_reset_check(proc)) return;
}
}
此方法可实现在按键上滑动而不会导致识别为滑动手势