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 等一些控件都是有手势滑动的操作,理论上用这种控件都是可以的。最初做的时候,就是按照现在这种方式去实现的,用的效果还算能够接受,就没有研究太多,以后在研究系统自带的手势。
如有不正确的地方欢迎指正。