下面是有关触摸屏应用的相关介绍,希望对你有所帮助!
目录
1. 触摸屏应用编程
1.1 概念
触摸屏的本质是传感器,它由测触摸检部件和触摸屏控制器组成。触摸检测部件安装在显示器屏幕前面,用于检测用户触摸位置,接受后发送触摸屏控制器;
触摸屏控制器的主要作用是从触摸点检测装置接收触摸信息,并将它转换成触点坐标送给CPU,同时能接收CPU发来的命令并加以执行。
1.2 分类
- 红外线式触摸屏
- 电阻式触摸屏
- 表面声波式触摸屏
- 电容式触摸屏
2. 解析触摸屏设备上报的数据
触摸屏设备是一个绝对位移设备,可以上报绝对位移事件(EV_ABS),绝对位移事件如下:
/*
* Absolute axes
*/
#define ABS_X 0x00 //X 轴坐标
#define ABS_Y 0x01 //Y 轴坐标
#define ABS_Z 0x02 //Z 轴坐标
#define ABS_RX 0x03
#define ABS_RY 0x04
#define ABS_RZ 0x05
#define ABS_THROTTLE 0x06
#define ABS_RUDDER 0x07
#define ABS_WHEEL 0x08
#define ABS_GAS 0x09
#define ABS_BRAKE 0x0a
#define ABS_HAT0X 0x10
#define ABS_HAT0Y 0x11
#define ABS_HAT1X 0x12
#define ABS_HAT1Y 0x13
#define ABS_HAT2X 0x14
#define ABS_HAT2Y 0x15
#define ABS_HAT3X 0x16
#define ABS_HAT3Y 0x17
#define ABS_PRESSURE 0x18 //按压力
#define ABS_DISTANCE 0x19
#define ABS_TILT_X 0x1a
#define ABS_TILT_Y 0x1b
#define ABS_TOOL_WIDTH 0x1c
#define ABS_VOLUME 0x20
#define ABS_MISC 0x28
........
3.单点触摸和多点触摸
3.1 单点触摸
触摸屏分为多点触摸设备和单点触摸设备。
单点触摸设备只支持单点触摸,一轮(一个同步事件) 完整的数据只包含一个触摸点信息;单点触摸设备以 ABS_XXX 事件承载、上报触摸点的信息,譬如 ABS_X(value 值对应的是 X 轴坐标值)、ABS_Y(value 值对应的是 Y 轴坐标值)等绝对位移事件,而有些设备可能还支持 Z 轴坐标(通过 ABS_Z 事件上报、value 值对应的便是 Z 轴坐标值)、按压力大小 (通过 ABS_PRESSURE 事件上报、 value 值对应的便是按压力大小)以及接触面积等属性。
大部分的单点触摸设备都会上报 ABS_X 和 ABS_Y 事件,而其它绝对位移事件则根据具体的设备以及驱动的实现而定!
3.2 多点触摸
多点触摸设备可支持多点触摸,对于多点触摸设备,一轮完整的数据可能包含多个触摸点信息。多点触摸设备则是以 ABS_MT_XXX(MT 是 Multi-touch,意思为:多点触摸)事件承载、上报触摸点的信息,如 ABS_MT_POSITION_X(X 轴坐标)、ABS_MT_POSITION_Y(Y 轴坐标)等绝对位移事件。
3.3 触摸事件
触摸屏设备除了上报绝对位移事件之外,还可以上报按键类事件和同步类事件。同步事件很好理解,因为几乎每一个输入设备都会上报同步事件、告知应用层本轮数据是否完整;当手指点击触摸屏或手指从触摸屏离开时,此时就会上报按键类事件,用于描述按下触摸屏和松开触摸屏;具体的按键事件为 BTN_TOUCH(code=0x14a,也就是 330),当然,手指在触摸屏上滑动不会上报 BTN_TOUCH 事件。
Tips: BTN_TOUCH 事件不支持长按状态,故其 value 不会等于 2。 对于多点触摸设备来说,只有第一个点按下时上报 BTN_TOUCH 事件 value=1、当最后一个点离开触摸屏时上报 BTN_TOUCH 事件 value=0。
4. MT 协议之 Type B 协议
4.1 ABS_MT_SLOT
在 Linux 内核中,多点触摸设备使用多点触摸(MT)协议上报各个触摸点的数据,MT 协议分为两种类型:Type A 和 Type B,Type A 协议实际使用中用的比较少,几乎处于淘汰的边缘,现在所有内核驱动程序都已转换为使用 Type B,所以重点来看看 Type B 协议。
Type B 协议适用于能够追踪并区分触摸点的设备,Type B 协议的重点是通过 ABS_MT_SLOT 事件上报各个触摸点信息的更新!
能够追踪并区分触摸点的设备通常在硬件上能够区分不同的触摸点,每个识别出来的触摸点分配一个 slot, 与该 slot 关联起来,这个 slot 就是一个编号,利用这个 slot 来传递对应触点的变化。
4.2 ABS_MT_TRACTKING_ID
除了 ABS_MT_SLOT 事 件 之 外 , Type B 协 议 还 会 使 用 到 ABS_MT_TRACTKING_ID 事 件 ,该事件用于触摸点的创建、替换和销毁工作。
ABS_MT_TRACTKING_ID 事件携带的数据 value 表示一个 ID,一个非负数的 ID(ID>=0)表示一个有效的触摸点,如果 ID 等于 -1 表示该触摸点已经不存在、被移除了;一个以前不存在的 ID 表示这是一个新的触摸点。
Type B 协议可以减少发送到用户空间的数据,只有发生了变更的数据才会上报,譬如某个触摸点发生了移动,但仅仅只改变了 X 轴坐标、而未改变 Y 轴坐标,那么内核只会将改变后的 X 坐标值通过 ABS_MT_POSITION_X 事件发送给应用层。
5. 获取触摸屏的信息
ioctl()函数
//函数原型
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
/*
第一个参数 fd 对应文件描述符;
第二个参数 request 与具体要操作的对象有关,没有统一值,表示向文件描述符请求相应的操作,也就是请求指令,此函数是一个可变参函数
第三个参数需要根据 request 参数来决定,配合 request 来使用。
*/
举个例子
//ioctl函数获取显示屏信息并存储
struct fb_fix_screeninfo fb_fix; //固定参数信息
struct fb_var_screeninfo fb_var; //可变参数信息
int lcdfd = open("/dev/fb0", O_RDWR); //以可读可写的方式打开LCD
ioctl(lcdfd, FBIOGET_VSCREENINFO, &fb_var);
ioctl(lcdfd, FBIOGET_FSCREENINFO, &fb_fix);
6. 单点触摸应用程序
获取触摸点的坐标信息,并将其打印出来!
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
int main()
{
int x, y;
//定义输入输出设备子系统结构体
struct input_event myts;
//int x,y;
//打开触摸屏设备/dev/input/event1
int ts_fd = open("/dev/input/event1",O_RDWR);
//获取一次点击坐标
while(1)
{
//读取触摸屏事件
read(ts_fd,&myts,sizeof(myts));
//判断事件类型是否为触摸屏的x轴,并且获取x轴坐标
if(myts.type == EV_ABS && myts.code == ABS_MT_POSITION_X)
{
x = myts.value;
}
//判断事件类型是否为触摸屏的y轴,并且获取y轴坐标
if(myts.type == EV_ABS && myts.code == ABS_MT_POSITION_Y)
{
y = myts.value;
}
//判断是否松手
if(myts.type == EV_ABS && myts.code == ABS_MT_TRACKING_ID && myts.value == -1)
{
//打印坐标值
printf("X:%d,Y:%d\n", x, y);
break;
}
}
}
如果喜欢请不吝给予三连支持!