C语言实现触摸屏手势识别 - 上下左右滑动与点击判断
这段代码是用来判断触摸屏上的手势操作是上下左右滑动还是点击触摸屏的。代码中通过读取触摸屏设备的输入事件信息来获取触摸屏的坐标信息。
代码首先打开触摸屏设备文件,并定义一个输入事件的结构体变量'tsbuf'来接收输入信息。然后通过循环读取触摸屏信息,判断事件的类型和代码。
如果事件类型是'EV_ABS'(绝对坐标事件),则根据事件的代码判断是x坐标事件还是y坐标事件,并将对应的坐标值赋给变量'x'和'y'。如果事件代码是'ABS_PRESSURE'(压力事件)且值为0(表示压力已经释放),则将最后一次的坐标点赋给'x1'和'y1',并跳出循环。
如果事件类型是'EV_KEY'(按键事件)且事件代码是'BTN_TOUCH'(触摸屏按键事件)且值为0(表示触摸屏按键已经松开),同样将最后一次的坐标点赋给'x1'和'y1',并跳出循环。
在循环中还记录了第一次获取到的坐标点,赋给'x2'和'y2'。
然后根据'x1'和'x2'的差值和'y1'和'y2'的差值来判断手势操作的类型。如果'x_offset'大于0且绝对值大于'y_offset'的绝对值,则判断为右滑动;如果'x_offset'小于0且绝对值大于'y_offset'的绝对值,则判断为左滑动;如果'y_offset'小于0且绝对值大于'x_offset'的绝对值,则判断为上滑动;如果'y_offset'大于0且绝对值大于'x_offset'的绝对值,则判断为下滑动。
最后,根据具体的手势类型进行相应的处理,比如打印对应的提示信息或者调用其他函数进行相应的操作。最后关闭触摸屏设备文件并返回相应的手势类型。
//判断是上下左右滑动还是点击触摸屏
int Get_slide(int *x, int *y, list head)
{
// 定义一个输入子系统结构体 接收输入信息
struct input_event tsbuf;
bzero(&tsbuf, sizeof(tsbuf));
//标准IO打开触摸屏设备
FILE *fp = fopen("/dev/input/event0", "r+");
if(fp == NULL)
{
perror("打开触摸屏失败\n");
}
int ret;
// 记录终止点坐标点
int x1,y1;
int num = 0;
while(1)
{
// 读取触摸屏信息
// 你按触摸屏 你产生的信息 会暂时 保留在 evnet0里 scanf 默认阻塞函数 当读取不到数据一直等待
ret = fread(&tsbuf, sizeof(tsbuf), 1, fp);
if(ret < 0)
{
printf("读取失败\n");
}
// 事件的类型 只显示触摸屏事件代码
if(tsbuf.type == EV_ABS)
{
// 是否是x 坐标事件
if(tsbuf.code == ABS_X)
{
// 我们把获取的x坐标赋值给 x变量
*x = tsbuf.value;
num++;
}
// 是否y 坐标事件
if(tsbuf.code == ABS_Y)
{
// 我们把获取的y坐标赋值给 y变量
*y = tsbuf.value;
num++;
}
// 是否是 压力事件 压力弹开 并记录最后一次坐标
if(tsbuf.code == ABS_PRESSURE && tsbuf.value == 0)
{
x1 = *x;
y1 = *y;
break;
}
}
// 按键退出的判断 事件是按键事件 触摸屏类按键事件 触摸屏的松开 并记录最后一次坐标
if(tsbuf.type == EV_KEY && tsbuf.code == BTN_TOUCH && tsbuf.value == 0)
{
x1 = *x;
y1 = *y;
break;
}
// 记录第一次坐标
if(num == 2)
{
x2 = *x;
y2 = *y;
}
}
// 偏移量
int x_offset = x1 - x2;
int y_offset = y1 - y2;
// abs 函数获取绝对值
if(x_offset > 0 && (abs(x_offset) > abs(y_offset)) )
{
printf("右滑\n");
return 1;
}
else if(x_offset < 0 && (abs(x_offset) > abs(y_offset)) )
{
printf("左滑\n");
return 2;
}
else if(y_offset < 0 && (abs(x_offset) < abs(y_offset)) )
{
printf("上滑\n");
return 3;
}
else if(y_offset > 0 && (abs(x_offset) < abs(y_offset)) )
{
printf("下滑\n");
return 4;
}
printf("x is %d \t y is %d\n",x2,y2);
Refresh_num(x2 ,y2 , head);
fclose(fp);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/qtB5 著作权归作者所有。请勿转载和采集!