满足以下两个条件为多点触摸设备:
1)输入设备驱动报告了ABS_MT_POSITION_X
和ABS_MT_POSITION_Y存在
2)输入设备没有任何手柄按钮
满足以下两个条件为单点触摸设备:
1)输入设备不被归类为多点触摸设备
2)输入设备报告存在ABS_X和ABS_Y绝对轴,以及存在BTN_TOUCH按键码
所有内置的触摸设备应该有输入设备的配置文件(.idc, input device configuration files).如果输入设备配置文件不存在,系统将选择一个通用的触摸设备配置做为默认配置。这些默认配置不是专门为内置触摸设备设计的,有可能导致工作不正常。
当输入设备配置(idc)被加载之后,系统将把输入设备分为触摸屏(touch screen),触摸板(touch pad)或指针设备(pointer device).
1)触摸屏:使用它,可以直接操作屏幕上的对象。
2)触摸板:它提供绝对的定位信息给触摸区域内的应用程序。
3)指针设备:使用它,通过光标间接操作屏幕上的对象。手指为多点触摸指针手势,其它工具,如铁笔,被解释为使用绝对位置。
以上三类设备的分类规则如下:
1)如果.idc中设置了touch.deviceType属性,则设备类型被设置为它所指定的设备类型(如:touchScreen)
2)如果输入设备通过EVIOCGPROP ioctl报告了存在INPUT_PROP_DIRECT输入属性,则此设备类型被设置为触摸屏。
3)如果输入设备通过EVIOCGPROP ioctl报告了存在INPUT_PROP_POINTER输入属性,则此设备类型被设置为指针设备。
4)如果输入设备报告了存在REL_X和REL_Y相对轴,则设备类型被设置为触摸板。
5)如果不满足以上条件,则设备类型被设置为指针设备。
按钮是可选控制,应用程序使用它执行其这功能。触摸设备上的按钮功能类似于鼠标按钮,主要被指针触摸设备或铁笔使用。
支持的按钮如下:
BTN_LEFT: 被映射为: MotionEvent.BUTTON_PRIMARY.
BTN_RIGHT: 被映射为: MotionEvent.BUTTON_SECONDARY.
BTN_MIDDLE: 被映射为: MotionEvent.BUTTON_MIDDLE.
BTN_BACK and BTN_SIDE:被映射为:MotionEvent.BUTTON_BACK. 按此按钮也生成一个按键:KeyEvent.KEYCODE_BACK.
BTN_FORWARD and BTN_EXTRA: 被映射为: MotionEvent.BUTTON_FORWARD. 按此按钮也生成一个按键:KeyEvent.KEYCODE_FORWARD.
BTN_STYLUS: 被映射为:MotionEvent.BUTTON_SECONDARY.
BTN_STYLUS2: 被映射为:MotionEvent.BUTTON_TERTIARY.
一个工具是一个用于与触摸设备进行交互的手指、铁笔或其它设备。一些触摸设备可以区别不同的触摸工具类型。Android支持以下触摸工具类型:
BTN_TOOL_FINGER
andMT_TOOL_FINGER
: 被映射为MotionEvent.TOOL_TYPE_FINGER
.
BTN_TOOL_PEN
andMT_TOOL_PEN
: 被映射为MotionEvent.TOOL_TYPE_STYLUS
.
BTN_TOOL_RUBBER
: 被映射为MotionEvent.TOOL_TYPE_ERASER
.
BTN_TOOL_BRUSH
: 被映射为MotionEvent.TOOL_TYPE_STYLUS
.
BTN_TOOL_PENCIL
: 被映射为MotionEvent.TOOL_TYPE_STYLUS
.
BTN_TOOL_AIRBRUSH
: 被映射为MotionEvent.TOOL_TYPE_STYLUS
.
BTN_TOOL_MOUSE
: 被映射为MotionEvent.TOOL_TYPE_MOUSE
.
BTN_TOOL_LENS
: 被映射为MotionEvent.TOOL_TYPE_MOUSE
.
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
, andBTN_TOOL_QUADTAP
: 被映射为MotionEvent.TOOL_TYPE_FINGER
.
工具与触摸设备接触或在触摸设备上一定范围内盘旋。不是所有的触摸设备都能识别触摸工具在触摸设备上盘旋。如基于射频的手写笔数字化仪,当一个工具在其上面一定范围内盘旋时,它可以检测到。
InputReader模块负责区分触摸工具中哪些是盘旋工具。同样,触摸工具(touching tools)和盘旋工具(hovering tools)以不同的方式报告给应用程序。
触摸工具通过触摸事件(touch events)报告给应用程序,如:MotionEvent.ACTION_DOWN
,MotionEvent.ACTION_MOVE
,MotionEvent.ACTION_DOWN
,MotionEvent.ACTION_POINTER_DOWN
andMotionEvent.ACTION_POINTER_UP。
盘旋工具通过通用的运动事件(generic motion events)报告给应用程序,如:
MotionEvent.ACTION_HOVER_ENTER
,MotionEvent.ACTION_HOVER_MOVE
andMotionEvent.ACTION_HOVER_EXIT
.
1) 触摸设备驱动应当只需要注册轴、与轴对应的键值和真正支持的按钮。注册过多的轴或键值可能会迷惑设备分类算法或导致系统不能正确地检测设备的能力。
比如:如果设备驱动报告了BTN_TOUCH键值, Android系统将认为BTN_TOUCH总是被用于指示触摸工具是否真正地接触触摸屏或仅仅在上方盘旋。
2) 单点触摸(Single-touch)设备支持以下Linux输入事件:
3) 多点触摸(Multi-touch)设备支持以下Linux输入事件:
4) 如果单点触摸和多点触摸的轴都定义了,则只有多点协议的轴被使用,单点触摸的轴则被忽略。
5) ABS_X
, ABS_Y
, ABS_MT_POSITION_X
andABS_MT_POSITION_Y
轴的最小值和最大值以设备表面具体的单位(如像素)定义了活动区域的边界。对于触摸屏,活动区域描述了触摸设备真正覆盖显示部分的区域。
6) 在Android4.0中,触摸屏驱动需要修改以与Linux输入协议规范兼容。
下列变化可能需要:
1) 当一个工具变成不活动时(如手指抬起) ,在随后的multi-touch sync report它不应该出现;当所有的工具不活动时(如所有的手指抬起),驱动应该发送一个空的sync report包,如:SYN_MT_REPORT紧跟一个SYN_REPORT。
以前的Android版本期望报告一个up事件(通过发送一个pressure值为0) 。旧的操作方式与Linux input协议规范不兼容,所以不再使用。
2) 物理压力或信号强度信息应该使用ABS_MT_PRESSURE报告。
以前的Android版本从ABS_MT_TOUCH_MAJOR获取压力信息。旧的操作方式与Linux input协议规范不兼容,所以不再使用。
3) 触摸尺寸信息通过ABS_MT_TOUCH_MAJOR报告。
以前的Android版本从ABS_MT_TOOL_MAJOR获取触摸尺寸信息。旧的操作方式与Linux input协议规范不兼容,所以不再使用。
触摸设备驱动不再需要Android定制化。通过标准的Linux input协议,Android可以支持大量的触摸设备,且不用修改驱动。
参考:http://source.android.com/tech/input/touch-devices.html