获取触摸屏点击坐标和滑屏判断函数
下面代码有两个功能函数,get_slide()用于滑屏和获取点击坐标,而get_ts()仅用于获取一次点击坐标。#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <lin
·
下面代码有两个功能函数,get_slide()用于滑屏和获取点击坐标,而get_ts()仅用于获取一次点击坐标。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h> //输入子系统头文件
//触摸屏文件路径
#define TS_DEV "/dev/input/event0"
//获取的(x,y)坐标
int ts_x,ts_y;
/*
功能: 获取一次划动的方向或点击坐标
返回值:1-->右滑; 2-->左滑; 3-->上滑; 4-->下滑; 5-->点击(获取到点击坐标)
*/
int get_slide()
{
int x1, x2, y1, y2;
int flag = 0; //记录当前获取到的坐标的个数 : 0 --> 无; 1-->横坐标; 2-->横纵坐标
struct input_event xy;
//1, 打开触摸屏文件
int fd = open(TS_DEV, O_RDWR);
if(-1 == fd)
{
perror("open ts failed");
return -1;
}
//2, 读取分析触摸屏数据 -->获取起点坐标
while(1)
{
read(fd, &xy, sizeof(xy)); //如果触摸屏文件中没有数据-->程序在此阻塞!
if(xy.type == EV_ABS && xy.code == ABS_X && flag == 0)
{
flag = 1;
x1 = xy.value *800/1024; //对获取的坐标进行等比例换算
}
if(xy.type == EV_ABS && xy.code == ABS_Y && flag == 1)
{
flag = 2;
y1 = xy.value *480/600;
}
if(flag == 2) //获取的第一个坐标就是起点坐标
{
flag = 0;
printf("start : (%d, %d)\n", x1, y1);
break;
}
}
x2 = x1; y2 = y1;
//获取终点坐标 (x2, y2)
while(1)
{
read(fd, &xy, sizeof(xy)); //如果触摸屏文件中没有数据-->程序在此阻塞!
if(xy.type == EV_ABS && xy.code == ABS_X )
{
x2 = xy.value *800/1024; //对获取的坐标进行等比例换算
}
if(xy.type == EV_ABS && xy.code == ABS_Y )
{
y2 = xy.value *480/600;
}
if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)//压力值为0的时候此时获取终点坐标
{
printf("end : (%d, %d)\n", x2, y2);
break;
}
}
//判断终点位置相对起点的位置
if(x2>x1 && (y2-y1)*(y2-y1) < (x2-x1)*(x2-x1)) //右划
{
printf("right slide -->\n");
close(fd);
return 1;
}
if(x2<x1 && (y2-y1)*(y2-y1) < (x2-x1)*(x2-x1)) //左划
{
printf("left slide <--\n");
close(fd);
return 2;
}
if(y2<y1 && (y2-y1)*(y2-y1) > (x2-x1)*(x2-x1)) //上划
{
printf("up slide ^\n");
close(fd);
return 3;
}
if(y2>y1 && (y2-y1)*(y2-y1) > (x2-x1)*(x2-x1)) //下划
{
printf("down slide v\n");
close(fd);
return 4;
}
if(x1 == x2 && y1 == y2) //不划
{
printf("点击 !\n");
ts_x = x1;
ts_y = y1;
close(fd);
return 5;
}
}
/*************************************************************************************/
//获取一次点击触摸屏坐标函数
int get_ts()
{
//1, 打开触摸屏文件
int fd = open(TS_DEV, O_RDWR);
if(-1 == fd)
{
perror("open ts failed");
return -1;
}
//2, 读取分析触摸屏数据
int flag = 0; //记录当前获取到的坐标的个数 : 0 --> 无; 1-->横坐标; 2-->横纵坐标
struct input_event xy;
while(1) //触摸屏坐标范围: 1024 * 600 LCD : 800*480
{
read(fd, &xy, sizeof(xy)); //如果触摸屏文件中没有数据-->程序在此阻塞!
if(xy.type == EV_ABS && xy.code == ABS_X && flag == 0)
{
flag = 1;
ts_x = xy.value *800/1024; //对获取的坐标进行等比例换算
}
if(xy.type == EV_ABS && xy.code == ABS_Y && flag == 1)
{
flag = 2;
ts_y = xy.value *480/600;
}
if(flag == 2)
{
flag = 0;
break;
}
}
//3, 关闭触摸屏文件
close(fd);
}
更多推荐
已为社区贡献1条内容
所有评论(0)