基于LVGL7.5实现 tp手势识别
lvgl7.5 自身带的手势识别
lvgl 自身有手势识别的实现,直接看作者在论坛上提供的代码
void scr_event_cb(lv_obj_t * obj, lv_event_t e)
{if(e == LV_EVENT_GESTURE) {lv_gesture_dir_t dir = lv_indev_get_gesture_dir(lv_indev_get_act());printf("Dir: %d\n", dir);}
}lv_obj_set_event_cb(lv_scr_act(), scr_event_cb);
这段代码可以直接运行,左右上下滑动,会打印处对应的方向。
回调函数监听的是lv_scr_act()对象的。如果你的UI里面还有基于lv_scr_act()创建的其他控件,也会调到这个回调函数,这样就没法区分在哪一个界面上的手势。如果只有一个lv_scr_act()则可以监听到对应手势。
这个没有做太多的研究(对lvgl不熟悉,暂时没研究),由于我的UI界面相对层级较多,暂时没有采用这用方式,自己去实现
不满足实际需求自己实现
直接看代码
/*
*brief: touch screen gesture handler
*param: obj* : lv_obj_t *, event : lv_event_t
*return:touch_enum
*/
touch_enum lv_gesture_handler(lv_obj_t * obj, lv_event_t event)
{touch_enum gesture = TOUCH_UNKONW;if(event == LV_EVENT_PRESSED){touch_get_point(&tp_clicked, &tp_t);return TOUCH_UNKONW;}else if(event == LV_EVENT_RELEASED){touch_get_point(&tp_pressed, &tp_t);gesture = touch_get_gesture(&tp_clicked, &tp_pressed);}else if(event == LV_EVENT_DEFOCUSED){touch_get_point(&tp_pressed, &tp_t);gesture = touch_get_gesture(&tp_clicked, &tp_pressed);}return gesture;
}
其核心思想是:
1 .获取对象按下的坐标记录到tp_clicked ,我是直接在tp中直接保存的,也可以有用lvgl提供的lv_indev_get_point的函数
2. 继续监控抬起事件,同样记录到tp_pressed,如果有失去焦点事件,同样保存到tp_pressed中,特别说明,这两个时间是互斥的,不会同时发生(我之前的做法是没有监控LV_EVENT_DEFOCUSED,当一个界面两个图标,如下图,从左往右滑动的手势,就会误触到右边的图标)。
3. 关于坐标的处理,比较按下和抬起(失去焦点)坐标的比较,判断是哪个放下的,网上有很多教程
#define LENGHT_PRESSED_RELEASED_X_ABS 0 //abs of press x - release x
#define LENGHT_PRESSED_RELEASED_Y_ABS 0 //abs of press y - release y
/*
*brief: touch screen(slide) get gesture(touchpad rekeased #LV_EVENT_RELEASED call it)
*param: tp_struct * : start & end (press & release touch screen)
*return:touch_enum
*/
touch_enum touch_get_gesture(tp_struct * start,tp_struct * end)
{short x,y,abs_x,abs_y;x = end->x - start->x;y = end->y - start->y; abs_x = abs(x);abs_y = abs(y);TOUCH_PRINTF("\r\n x= %d y=%d abs_x = %d abs_y = %d",x,y,abs_x,abs_y);if(abs_x > abs_y && x > LENGHT_PRESSED_RELEASED_X_ABS){TOUCH_PRINTF("\r\nTOUCH_RIGHT");return TOUCH_RIGHT;}else if(abs_x > abs_y && x < LENGHT_PRESSED_RELEASED_X_ABS){TOUCH_PRINTF("\r\nTOUCH_LEFT");return TOUCH_LEFT;}else if(abs_x < abs_y && y > LENGHT_PRESSED_RELEASED_Y_ABS){TOUCH_PRINTF("\r\nTOUCH_UP");return TOUCH_UP;}else if(abs_x < abs_y && y < LENGHT_PRESSED_RELEASED_Y_ABS){TOUCH_PRINTF("\r\nTOUCH_DOWN");return TOUCH_DOWN;}else{return TOUCH_UNKONW;}
}
总结
lvgl Tabview 控件中添加两个或两个以上的 tab 这个就是手势的判断,page 等一些控件都是有手势滑动的操作,理论上用这种控件都是可以的。最初做的时候,就是按照现在这种方式去实现的,用的效果还算能够接受,就没有研究太多,以后在研究系统自带的手势。
如有不正确的地方欢迎指正。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
