C语言实现触摸屏滑动方向判断 - 上下左右滑动及点击识别
这段代码实现了通过读取触摸屏设备的输入事件来判断用户是上下左右滑动还是点击的功能。
代码首先打开触摸屏设备文件 /dev/input/event0,进入一个无限循环,使用 fread 函数读取触摸屏信息。
当读取到触摸屏事件时,根据事件类型和事件代码判断事件类型。
如果事件类型为 EV_ABS,说明是坐标事件,根据事件代码判断是 X 坐标事件还是 Y 坐标事件,并将坐标值赋给相应的变量。当检测到压力事件的值为 0 时,表示用户松开手指,记录下最后一次的坐标点。
如果事件类型为 EV_KEY,且事件代码为 BTN_TOUCH,且事件值为 0,表示触摸屏的松开事件,记录下最后一次的坐标点。
在记录完最后一次的坐标点后,计算得到偏移量,通过偏移量的值来判断用户的操作。
- 如果 x 偏移量大于 0 且 x 偏移量的绝对值大于 y 偏移量的绝对值,则判断为右滑操作。
- 如果 x 偏移量小于 0 且 x 偏移量的绝对值大于 y 偏移量的绝对值,则判断为左滑操作。
- 如果 y 偏移量小于 0 且 y 偏移量的绝对值大于 x 偏移量的绝对值,则判断为上滑操作。
- 如果 y 偏移量大于 0 且 y 偏移量的绝对值大于 x 偏移量的绝对值,则判断为下滑操作。
最后,将得到的坐标点和操作信息用于更新显示,关闭触摸屏设备文件,并返回用户的操作类型。
以下是代码的详细解释:
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;
}
这段代码的主要功能是:
- 读取触摸屏事件: 使用
fread函数从/dev/input/event0设备文件中读取触摸屏事件信息。 - 解析事件: 根据事件类型和事件代码判断是坐标事件还是按键事件,并分别进行处理。
- 记录坐标: 记录触摸开始和结束时的坐标,用于计算偏移量。
- 判断滑动方向: 通过比较 x 偏移量和 y 偏移量的大小,判断用户是上下左右滑动还是点击。
- 返回操作类型: 根据判断结果返回相应的操作类型。
代码中还包含了 Refresh_num 函数,用来根据最终的坐标值进行一些更新操作,具体实现需要根据实际应用需求来定义。
希望这份解释能够帮助你更好地理解这段代码。
注意:
- 代码需要在有触摸屏的设备上运行,并且需要 root 权限才能访问
/dev/input/event0设备文件。 - 代码中使用的
Refresh_num函数是一个占位符,需要根据实际应用需求进行定义。 - 这段代码仅仅提供了一个基本的思路,实际应用中可能需要根据具体的需求进行调整和完善。
原文地址: https://www.cveoy.top/t/topic/qtA7 著作权归作者所有。请勿转载和采集!