二、touch事件分析


1、机器touch设备的具体信息

分析:此设备名字:mtk-tpd

支持:key abs

支持abs的type:0000 0001 0018...

type0035支持的最大取值为480


2、touch 事件

触摸事件的type:

#defineSYN_REPORT0

#defineSYN_CONFIG1

#defineSYN_MT_REPORT2

………………………...

#defineABS_MT_TOUCH_MAJOR0x30/*Majoraxisoftouchingellipse*/

#defineABS_MT_TOUCH_MINOR0x31/*Minoraxis(omitifcircular)*/

#defineABS_MT_WIDTH_MAJOR0x32/*Majoraxisofapproachingellipse*/

#defineABS_MT_WIDTH_MINOR0x33/*Minoraxis(omitifcircular)*/

#defineABS_MT_ORIENTATION0x34/*Ellipseorientation*/

#defineABS_MT_POSITION_X0x35/*CenterXellipseposition*/

#defineABS_MT_POSITION_Y0x36/*CenterYellipseposition*/

#defineABS_MT_TOOL_TYPE0x37/*Typeoftouchingdevice*/

#defineABS_MT_BLOB_ID0x38/*Groupasetofpacketsasablob*/

区分手机设备单点还是多点:

intEventHub::open_device(constchar*deviceName)

{

………………………

if(test_bit(ABS_MT_TOUCH_MAJOR,abs_bitmask)

&&test_bit(ABS_MT_POSITION_X,abs_bitmask)

&&test_bit(ABS_MT_POSITION_Y,abs_bitmask)){

device->classes|=CLASS_TOUCHSCREEN|CLASS_TOUCHSCREEN_MT;

//LOGI("Itisamulti-touchscreen!");

}

//single-touch?

elseif(test_bit(BTN_TOUCH,key_bitmask)

&&test_bit(ABS_X,abs_bitmask)

&&test_bit(ABS_Y,abs_bitmask)){

device->classes|=CLASS_TOUCHSCREEN;

//LOGI("Itisasingle-touchscreen!");

}

………………..

}


对于一个Touch事件,不同机型会有不同的组成,你用getevent显示出来的也不一样。可以通过下面几点去组成一个touch事件:

1、是否支持BTN_TOUCH,通过判断该abs设备是否还支持key事件来判断是否需要BTN_TOUCH,像

这个就是支持key事件的,而且持之BTN_TOUCH(014a :十进制为330)。对于这种设备,

在发送touchdown事件的时候需要添加 eventX 0001 014a 1的事件,对应在touchUp的时候需要添加eventX 0001 014a 0。

当不支持BTN_TOUCH的时候,就要省去该事件语句

2、判断多点触摸的协议类型,根据判断是否支持ABS_MT_SLOT。

多点触摸协议可以参考http://blog.csdn.net/droidphone/article/details/8434768

文章中详细说明了多点触摸协议的两种类型,还有两种类型分别的事件语句组成

A:有状态类型

ABS_MT_TRACKING_ID touchDown必须要有值,touchUp的时候值为-1

同步语句只要SYN_REPORT

B:无状态类型

ABS_MT_TRACKING_ID touchDown必须要有值,touchUp的时候值为0

同步语句要包括:SYN_REPORT 、SYN_MT_REPORT

3、对于touchDown,还必须包括:ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_REPORT

ABS_MT_TOUCH_MAJOR

ABS_MT_PRESSURE

4、对于touchMove,还必须包括:ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_REPORT

(无状态)ABS_MT_TRACKING_ID、SYN_MT_REPORT

ABS_MT_TOUCH_MAJOR

5、对于touchUP,还必须包括:

有状态:ABS_MT_TRACKING_ID -1
BTN_TOUCH 0
SYN_REPORT
无状态:ABS_MT_TRACKING_ID 0
ABS_MT_TOUCH_MAJOR 0
BTN_TOUCH 0
SYN_MT_REPORT
SYN_REPORT