Adroid 触摸屏设备

1. 触摸屏设备分类

1.1 多点触摸

满足以下两个条件为多点触摸设备:

1)输入设备驱动报告了ABS_MT_POSITION_XABS_MT_POSITION_Y存在

2)输入设备没有任何手柄按钮

1.2 单点触摸

满足以下两个条件为单点触摸设备:

1)输入设备不被归类为多点触摸设备

2)输入设备报告存在ABS_XABS_Y绝对,以及存在BTN_TOUCH按

1.3 输入设备配置文件

        所有内置触摸设备应该有输入设备的配置文件(.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)如果不满足以上条件,则设备类型被设置为指针设备。

 2. 按钮

        按钮是可选控制,应用程序使用它执行其这功能。触摸设备上的按钮功能类似于鼠标按钮,主要被指针触摸设备或铁笔使用。

支持的按钮如下:

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.

3. 工具和工具类型

        一个工具是一个用于与触摸设备进行交互的手指、铁笔或其它设备。一些触摸设备可以区别不同的触摸工具类型。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.

4. 盘旋 vs. 触摸工具

        工具与触摸设备接触或在触摸设备上一定范围内盘旋。不是所有的触摸设备都能识别触摸工具在触摸设备上盘旋。如基于射频的手写笔数字化仪,当一个工具在其上面一定范围内盘旋时,它可以检测到。

        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.   

5. 触摸设备驱动需求

       1) 触摸设备驱动应当只需要注册轴、与轴对应的键值和真正支持的按钮。注册过多的轴或键值可能会迷惑设备分类算法或导致系统不能正确地检测设备的能力。

         比如:如果设备驱动报告了BTN_TOUCH键值, Android系统将认为BTN_TOUCH总是被用于指示触摸工具是否真正地接触触摸屏或仅仅在上方盘旋。

        2) 单点触摸(Single-touch)设备支持以下Linux输入事件:       

  • ABS_X: (必须) :报告工具的x坐标
  • ABS_Y: (必须) :报告工具的y坐标
  • ABS_PRESSURE: (可选): 报告触摸工具顶尖处的压力或触摸接触的信号强度。
  • ABS_TOOL_WIDTH: (可选): 报告接触部分区域,或接触宽度或工具本身的宽度。
  • ABS_DISTANCE: (可选):报告从触摸设备表面到工具的距离
  • ABS_TILT_X: (可选): 报告工具沿触摸设备表面X轴的倾斜
  • ABS_TILT_Y: (可选):  报告工具沿触摸设备表面Y轴的倾斜.
  • BTN_TOUCH: (必须) :指示工具是否接触触摸设备.
  • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (可选):  报告按钮状态.
  • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (可选): 报告工具类型.

      3) 多点触摸(Multi-touch)设备支持以下Linux输入事件:      

  • ABS_MT_POSITION_X: (必须): 报告工具的X坐标
  • ABS_MT_POSITION_Y: (必须): 报告工具的X坐标
  • ABS_MT_PRESSURE: (可选): 报告触摸工具顶尖处的压力或触摸接触的信号强度
  • ABS_MT_TOUCH_MAJOR: (可选): 报告接触面积或接触面的长轴
  • ABS_MT_TOUCH_MINOR: (可选): 报告接触面的短轴。如果ABS_MT_TOUCH_MAJOR 报告接触面积,且此参数不应该使用。
  • ABS_MT_WIDTH_MAJOR: (可选): 报告接触工具本身的面积,或接触工具本身的长轴。如果接触工具的尺寸未知,则不应该使用此参数。
  • ABS_MT_WIDTH_MINOR: (可选): 报告接触工具本身的短轴,如果ABS_MT_WIDTH_MAJOR报告了面积区域, 或接触工具的尺寸未知,则不应该使用此参数。
  • ABS_MT_ORIENTATION: (可选):报告工具的方向.
  • ABS_MT_DISTANCE: (可选):  报告从触摸设备表面到工具的距离.
  • ABS_MT_TOOL_TYPE: (可选): 报告工具类型为:MT_TOOL_FINGER 或 MT_TOOL_PEN.
  • ABS_MT_TRACKING_ID: (可选): 报告工具的跟踪.
  • ABS_MT_SLOT: (可选): 报告工具的slot id,当使用Linux多点协议B.参考其文档获取更多信息。 
  • BTN_TOUCH: (必须) : 指示工具是否接触触摸设备.
  • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (可选): 报告按钮状态
  • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (可选): 报告工具类型

      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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Linux驱动,Android系统)