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

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值