触摸设备

  • 目录
  • 触摸设备分类
  • 按钮
  • 工具和工具类型
  • 悬停与触摸工具
  • 触摸设备驱动程序要求
  • 触摸设备操作
  • 触摸设备配置
    • 属性
    • 文档规范
    • 基础配置
    • X 和 Y 字段
    • TouchMajor、TouchMinor、ToolMajor、ToolMinor、Size 字段
    • Pressure 字段
    • Orientation 和 Tilt 字段
    • Distance 字段
    • 示例
    • 兼容性说明
  • 虚拟按键映射文件
    • 语法
    • 示例
  • 间接多点触控指控手势
  • 延伸阅读

Android 支持各种触摸屏和触摸板,包括基于触控笔的数字化板。

触摸屏是与显示屏相关联的触摸设备,使用户能够在屏幕上直接操纵内容。

触摸板是不与显示屏相关联的触摸设备(如数字化板)。触摸板通常用于指控或绝对间接定位或基于手势的界面控制。

触摸设备可能具有功能与鼠标按钮类似的按钮。

有时可以使用各种不同的工具(如手指或触控笔)操作触摸设备,具体取决于底层的触摸传感器技术。

触摸设备有时用于实现虚拟按键。例如,在某些 Android 设备上,触摸屏传感器区域延伸超出显示屏的边缘,作为触摸式键盘的一部分发挥双重作用。

由于触摸设备种类繁多,Android 依赖于大量配置属性来描述每个设备的特征和期望的行为。

触摸设备分类

如果同时满足以下两个条件,那么输入设备属于多点触控设备:

  • 输入设备 告存在 ABS_MT_POSITION_XABS_MT_POSITION_Y 绝对轴。

  • 输入设备没有任何游戏手柄按钮。某些游戏手柄会使用与 MT 轴的代码重叠的代码来 告轴,而这一条件则消除了这种歧义。

如果同时满足以下两个条件,则输入设备属于单点触控设备:

  • 输入设备不属于多点触控设备。输入设备要么属于单点触控设备,要么属于多点触控设备,而不会同时属于这两种类别。

  • 输入设备 告存在 ABS_XABS_Y 绝对轴以及 BTN_TOUCH 按键代码。

如果输入设备属于触摸设备,系统会通过尝试加载设备的虚拟按键映射文件来确定是否存在虚拟按键。如果存在虚拟按键映射,则还会加载设备的按键布局文件。

有关虚拟按键映射文件的位置和格式,请参阅下面的部分。

接下来,系统会加载触摸设备的输入设备配置文件。

所有内置触摸设备都应具有输入设备配置文件。如果没有输入设备配置文件,系统将选择适用于典型通用触摸外围设备(如外部 USB 或蓝牙 HID 触摸屏或触摸板)的默认配置。这些默认配置不适用于内置触摸屏,很可能会导致错误的行为。

加载输入设备配置后,系统会将输入设备分类为触摸屏、触摸板或指控设备。

  • 触摸屏设备用于直接操纵屏幕上的对象。由于用户直接触摸屏幕,因此系统不需要任何额外的感知性来指示被操纵的对象。

  • 触摸板设备用于向应用提供关于在给定传感器区域上进行触摸时的绝对定位信息。它可能对数字化板有用。

  • 指控设备用于使用光标间接操纵屏幕上的对象。手指被解释为多点触控指控手势。其他工具(如触控笔)则通过绝对位置来解释。

    有关详情,请参阅间接多点触控指控手势。

以下规则用于将输入设备归类为触摸屏、触摸板或指控设备。

  • 如果设置了 touch.deviceType 属性,将按照指示设置设备类型。

  • 如果输入设备 告存在 INPUT_PROP_DIRECT 输入属性(通过 EVIOCGPROP ioctl),设备类型将设置为触摸屏。该条件假设直接输入触摸设备已连接到同样处于连接状态的显示屏。

  • 如果输入设备 告存在 INPUT_PROP_POINTER 输入属性(通过 EVIOCGPROP ioctl),设备类型将设置为指控设备。

  • 如果输入设备 告存在 REL_XREL_Y 相对轴,设备类型将设置为触摸板。该条件消除了由鼠标和触摸板组成的输入设备存在的歧义。在这种情况下,触摸板不会用于控制指针,因为指针已由鼠标控制。

  • 否则,设备类型将被设置为指控设备。该默认设置确保没有指定任何其他特殊用途的触摸板将用于控制指针。

按钮

按钮是可供应用执行其他功能的“可选”控件。触摸设备上的按钮与鼠标按钮类似,主要与“指控式”触摸设备或者触控笔配合使用。

支持以下按钮:

  • BTN_LEFT:映射到 MotionEvent.BUTTON_PRIMARY

  • BTN_RIGHT:映射到 MotionEvent.BUTTON_SECONDARY

  • BTN_MIDDLE:映射到 MotionEvent.BUTTON_MIDDLE

  • BTN_BACKBTN_SIDE:映射到 MotionEvent.BUTTON_BACK。按此按钮还可以合成按键(使用按键代码 KeyEvent.KEYCODE_BACK)。

  • BTN_FORWARDBTN_EXTRA:映射到 MotionEvent.BUTTON_FORWARD。按此按钮还可以合成按键(使用按键代码 KeyEvent.KEYCODE_FORWARD)。

  • BTN_STYLUS:映射到 MotionEvent.BUTTON_SECONDARY

  • BTN_STYLUS2:映射到 MotionEvent.BUTTON_TERTIARY

工具和工具类型

“工具”是指用于和触摸设备进行交互的手指、触控笔或其他装置。有些触摸设备可以区分不同类型的工具。

在 Android 的其他位置(和在 MotionEvent API 中一样),“工具”通常称为“指针”。

支持以下工具类型:

  • BTN_TOOL_FINGERMT_TOOL_FINGER:映射到 MotionEvent.TOOL_TYPE_FINGER

  • BTN_TOOL_PENMT_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_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:映射到 MotionEvent.TOOL_TYPE_FINGER

悬停与触摸工具

工具可以与触摸设备接触,也可以在触摸设备的感应范围内悬停在设备的上方。并非所有触摸设备都能够感应到悬停在其上方的工具。那些可实现感应的触摸设备(如基于射频的触控笔数字化仪)通常能在工具进入数字化仪有限的感应范围后检测到该工具。

InputReader 组件会谨慎区分触摸工具和悬停工具。同样,触摸工具和悬停工具也会以不同的方式 告给应用。

触摸工具将通过以下组件作为触摸事件 告给应用:MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_DOWNMotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP

悬停工具将通过以下组件作为通用动作事件 告给应用:MotionEvent.ACTION_HOVER_ENTERMotionEvent.ACTION_HOVER_MOVEMotionEvent.ACTION_HOVER_EXIT

触摸设备驱动程序要求

  1. 触摸设备驱动程序应该仅注册它们实际支持的轴/按钮的轴/按键代码。如果注册多余的轴/按键代码,可能会混淆设备分类算法或导致系统错误地检测设备的功能。

    例如,如果设备 告 BTN_TOUCH 按键代码,系统会假设 BTN_TOUCH 将始终用于指示该工具是否实际触摸屏幕。因此,不应使用 BTN_TOUCH 来指示该工具只是在感应范围内悬停。

  2. 单点触控设备使用以下 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_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2:(可选) 告按钮状态。

    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENSBTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:(可选) 告工具类型。

  3. 多点触控设备使用以下 Linux 输入事件:

    • ABS_MT_POSITION_X:(必需) 告工具的 X 坐标。

    • ABS_MT_POSITION_Y:(必需) 告工具的 Y 坐标。

    • 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_FINGERMT_TOOL_PEN

    • ABS_MT_TRACKING_ID:(可选) 告工具的跟踪 ID。跟踪 ID 是一个任意的非负整数。当多个工具同时处于活动状态时,该 ID 用于独立地识别和跟踪各个工具。例如,当多个手指同时触摸设备时,会为每个手指分配一个不同的跟踪 ID,用于在手指保持接触期间识别手指。跟踪 ID 可在其关联的工具移出感应范围后重复使用。

    • ABS_MT_SLOT:(可选)在使用 Linux 多点触控协议“B”时, 告工具的槽位 ID。有关详情,请参阅 Linux 多点触控协议文档。

    • BTN_TOUCH:(必需)指示工具是否触摸到设备。

    • BTN_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2:(可选) 告按钮状态。

    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENSBTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:(可选) 告工具类型。

  4. 如果同时定义了单点触控协议轴和多点触控协议轴,仅会使用多点触控轴,并忽略单点触控轴。

  5. ABS_XABS_YABS_MT_POSITION_XABS_MT_POSITION_Y 轴的最小值和最大值用于在特定于设备的 Surface 单元内指定设备有效区域的范围。如果是触摸屏,有效区域是指触摸设备实际覆盖显示屏的部分。

    对于触摸屏,系统会自动插入 告的触摸位置(在 Surface 单元内),以通过以下公式计算得出采用显示像素表示的触摸位置:

    触摸屏可能会 告在 告的有效区域之外发起的触摸。

    在有效区域之外发起的触摸不会传递给应用,但可用于虚拟按键。

    在有效区域内发起的触摸或进入和退出显示区域的触摸会传递给应用。因此,如果触摸是在应用的范围内开始,然后移动到有效区域之外,则应用可能会收到显示坐标为负或超出显示范围的触摸事件。这属于正常现象。

    触摸设备不得限制有效区域的触摸坐标边界。如果触摸退出有效区域,则应将其 告为超出有效区域范围,或者根本不应 告。

    例如,如果用户的手指在触摸屏左上角附近触摸,可能会 告 (minX, minY) 坐标。如果手指继续移动到有效区域之外,触摸屏应该开始 告分量小于 minX 和 minY 的坐标(如 (minX – 2, minY – 3)),或者完全停止 告触摸。换而言之,当用户的手指确实触摸到有效区域之外时,触摸屏不应该 告 (minX, minY)。

    如果将触摸坐标限制到显示屏边缘,会在屏幕边缘周围产生人为硬边界,阻止系统顺畅地跟踪进入或退出显示区域边界的动作。

  6. ABS_PRESSUREABS_MT_PRESSURE 告的值(如果有 告)在工具触摸设备时必须为非零值;否则就为零,表示该工具处于悬停状态。

    可以选择性 告压力信息,但强烈建议 告。应用可以使用压力信息实现压敏绘图等效果。

  7. ABS_TOOL_WIDTHABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINORABS_MT_WIDTH_MAJORABS_MT_WIDTH_MINOR 告的值在工具触摸设备时应为非零值;否则就为零,但这不是必需的。例如,触摸设备可能能够测量手指触摸区域的尺寸,但不能测量触控笔触摸区域的尺寸。

    可以选择性 告大小信息,但强烈建议 告。应用可以使用压力信息来实现尺寸敏感绘图等效果。

  8. ABS_DISTANCEABS_MT_DISTANCE 告的值在工具触摸设备时应接近零。即使当工具处于直接接触时,距离仍可能为非零。 告的确切值取决于硬件测量距离的方式。

    可以选择性 告距离信息,但建议 告触控笔设备的距离信息。

  9. 当工具垂直于设备时,ABS_TILT_XABS_TILT_Y 告的值应为零。将非零倾斜作为工具保持在倾斜处的标志。

    假定沿 X 轴和 Y 轴的倾斜角度以与垂直方向的夹角计。中心点(完全垂直)由 (max + min) / 2 针对每个轴指定。小于中心点的值表示向上或向左倾斜,大于中心点的值表示向下或向右倾斜。

    InputReader 将 X 和 Y 倾斜分量转换成从 0 到 PI / 2 弧度的垂直倾斜角以及从 -PIPI 弧度的平面定向角。该表示法将产生与描述手指触摸所用方向相符的方向描述。

    可以选择性 告倾斜信息,但建议 告触控笔设备的倾斜信息。

  10. 如果工具类型是由 ABS_MT_TOOL_TYPE 告的,它会取代 BTN_TOOL_* 告的任何工具类型信息。如果没有任何工具类型信息,工具类型将默认为 MotionEvent.TOOL_TYPE_FINGER

  11. 根据以下条件确定工具的活动状态:

    • 当使用单点触控协议时,如果 BTN_TOUCHBTN_TOOL_* 为 1,表示工具处于活动状态。

      这个条件意味着 InputReader 至少需要获得一些关于工具性质的信息:工具是否正在触摸,或者工具的类型。如果没有可用的信息,它会假定工具处于非活动状态(超出范围)。

    • 当使用多点触控协议“A”时,只要工具出现在最近的同步 告中,则表示其处于活动状态。当工具不再出现在同步 告中时,则表示工具不再存在。

    • 当使用多点触控协议“B”时,只要工具具有活动插槽,则表示其处于活动状态。当插槽被清除时,则表示工具不再存在。

  12. 根据以下条件确定工具悬停:

    • 如果工具为 BTN_TOOL_MOUSEBTN_TOOL_LENS,则该工具不会悬停,即使以下任一条件为真也不例外。

    • 如果工具处于活动状态,并且驱动程序 告的压力为零,表示工具处于悬停状态。

    • 如果工具处于活动状态,而且驱动程序支持 BTN_TOUCH 按键代码,并且 BTN_TOUCH 的值为零,表示工具处于悬停状态。

  13. InputReader 支持多点触控协议“A”和“B”。新驱动程序应该使用“B”协议,但是使用任一协议均可正常运作。

  14. 从 Android Ice Cream Sandwich 4.0 开始,可能需要更改触摸屏驱动程序,以符合 Linux 输入协议规范。

    可能需要进行以下更改:

    • 当一个工具变为非活动状态(“抬起”一根手指)时,它应该停止显示在后续的多点触控同步 告中。当所有工具变为非活动状态(“抬起”所有手指)时,驱动程序应发送一个空的同步 告数据包,如 SYN_MT_REPORT 后跟 SYN_REPORT

      以前版本的 Android 通过发送压力值 0 来 告“抬起”事件。该旧行为与 Linux 输入协议规范不兼容,因此不再受支持。

    • 物理压力或信 强度信息应使用 ABS_MT_PRESSURE 进行 告。

      以前版本的 Android 从 ABS_MT_TOUCH_MAJOR 检索压力信息。该旧行为与 Linux 输入协议规范不兼容,因此不再受支持。

    • 触摸尺寸信息应使用 ABS_MT_TOUCH_MAJOR 进行 告。

      以前版本的 Android 从 ABS_MT_TOOL_MAJOR 检索尺寸信息。该旧行为与 Linux 输入协议规范不兼容,因此不再受支持。

    触摸设备驱动程序不再需要 Android 系统专用的自定义设置。通过依靠标准的 Linux 输入协议,Android 可以使用未经修改的驱动程序支持更多种类的触摸外围设备,如外部 HID 多点触控触摸屏。

触摸设备操作

下面简要汇总了 Android 上的触摸设备操作。

  1. EventHubevdev 驱动程序读取原始事件。

  2. InputReader 会使用原始事件,并更新关于每个工具的位置和其他特征的内部状态。它还会跟踪按钮状态。

  3. 如果按下或释放“后退”或“前进”按钮,InputReader 会向 InputDispatcher 发出按键事件通知。

  4. InputReader 确定是否发生了虚拟按键的按压操作。如果是,它会向 InputDispatcher 发出按键事件通知。

  5. InputReader 确定触摸行为是否是在显示范围内发起的。如果是,它会向 InputDispatcher 发出触摸事件通知。

  6. 如果没有触摸工具,但至少有一个悬停工具,那么 InputReader 会向 InputDispatcher 发出悬停事件通知。

  7. 如果触摸设备类型是指控设备,InputReader 会执行指控手势检测,相应地移动指针和相关点,并向 InputDispatcher 发出指针事件通知。

  8. InputDispatcher 使用 WindowManagerPolicy 确定是否应调度这些事件,以及它们是否应唤醒设备。然后,InputDispatcher 会将事件传递给相应的应用。

触摸设备配置

触摸设备行为由设备的坐标轴、按钮、输入属性、输入设备配置、虚拟按键映射和按键布局确定。

要详细了解参与键盘配置的文件,请参阅以下部分:

  • 输入设备配置文件
  • 虚拟按键映射文件

属性

系统依赖于许多输入设备配置属性来配置和校准触摸设备行为。

原因之一是触摸设备的设备驱动程序通常使用特定于设备的单元来 告触摸特性。

例如,许多触摸设备使用内部特定于设备的比例(例如由触摸触发的传感器节点的总数)来测量触摸接触面积。此原始尺寸值对应用来说没有意义,因为它们需要了解触摸设备传感器节点的物理尺寸和其他特性。

系统使用在输入设备配置文件中编码的校准参数,将触摸设备 告的值解码、转换和标准化为应用可以理解的更简单的标准表示。

文档规范

原始轴值

以下表达式表示触摸设备驱动程序作为 EV_ABS 事件 告的原始值。

raw.x
ABS_XABS_MT_POSITION_X 轴的值。

raw.y

ABS_YABS_MT_POSITION_Y 轴的值。

raw.pressure

ABS_PRESSUREABS_MT_PRESSURE 轴的值,如果未提供,则为 0。

raw.touchMajor

ABS_MT_TOUCH_MAJOR 轴的值,如果未提供,则为 0。

raw.touchMinor

ABS_MT_TOUCH_MINOR 轴的值,如果未提供,则为 raw.touchMajor

raw.toolMajor

ABS_TOOL_WIDTHABS_MT_WIDTH_MAJOR 轴的值,如果未提供,则为 0。

raw.toolMinor

ABS_MT_WIDTH_MINOR 轴的值,如果未提供,则为 raw.toolMajor

raw.orientation

ABS_MT_ORIENTATION 轴的值,如果未提供,则为 0。

raw.distance

ABS_DISTANCEABS_MT_DISTANCE 轴的值,如果未提供,则为 0。

raw.tiltX

ABS_TILT_X 轴的值,如果未提供,则为 0。

raw.tiltY

ABS_TILT_Y 轴的值,如果未提供,则为 0。

原始轴范围

以下表达式表示原始值的范围。通过为每个轴调用 EVIOCGABS ioctl 获取它们。

raw.*.min
原始轴的最小值(含)。

raw.*.max

原始轴的最大值(含)。

raw.*.range

相当于 raw.*.max - raw.*.min

raw.*.fuzz

原始轴的精度。例如,fuzz = 1 表示值精确到 +/- 1 个单位。

raw.width

触摸区域的宽度(含),相当于 raw.x.range + 1

raw.height

触摸区域的高度(含),相当于 raw.y.range + 1

输出范围

以下表达式表示输出坐标系的特性。系统使用线性插值将触摸设备使用的 Surface 单元的触摸位置信息转换成将 告给应用的输出单元(如显示像素)。

output.width
输出宽度。对于触摸屏(与显示屏相关联),输出宽度是显示屏宽度(以像素为单位)。对于触摸板(不与显示屏相关联),输出宽度等于 raw.width,表示不会执行任何插值。

output.height

输出高度。对于触摸屏(与显示屏相关联),输出高度是显示屏高度(以像素为单位)。对于触摸板(不与显示屏相关联),输出高度等于 raw.height,表示不会执行任何插值。

output.diag

输出坐标系的对角线长度,相当于 sqrt(output.width ^2 + output.height ^2)

基础配置

触摸输入映射器在输入设备配置文件中使用许多配置属性来指定校准值。下表介绍了一些通用配置属性。在下面的部分中介绍了所有其他属性及其进行校准所用的字段。

touch.deviceType

定义:touch.deviceType = touchScreen | touchPad | pointer | default

指定触摸设备类型。

  • 如果值为 touchScreen,那么触摸设备是与显示屏相关联的触摸屏。

  • 如果值为 touchPad,那么触摸设备是不与显示屏相关联的触摸板。

  • 如果值为 pointer,那么触摸设备是不与显示屏相关联的触摸板,并且其动作用于间接多点触控指控手势。

  • 如果值为 default,系统将根据分类算法自动检测设备类型。

有关设备类型如何影响触摸设备的行为的详细信息,请参阅分类部分。

在 Honeycomb 之前,所有触摸设备都被视为触摸屏。

touch.orientationAware

定义:touch.orientationAware = 0 | 1

指定触摸设备是否应对显示屏的方向更改做出响应。

  • 如果值为 1,只要显示屏的方向更改了,触摸设备 告的触摸位置就会旋转。

  • 如果值为 0,触摸设备 告的触摸位置将不受显示屏方向更改的影响。

如果设备是触摸屏,默认值为 1,否则为 0

系统会区分内部和外部触摸屏与显示部分。方向感知型内部触摸屏基于内部显示部分的方向进行旋转。方向感知型外部触摸屏基于外部显示部分的方向进行旋转。

方向感知功能用于支持 Nexus One 等设备上的触摸屏旋转。例如,当设备从其自然方向顺时针旋转 90 度时,触摸的绝对位置将被重新映射,使得在触摸屏绝对坐标系左上角的触摸行为被 告为在显示屏旋转坐标系左上角的触摸行为。这样做是为了使用应用绘制其可见元素时所用的同一坐标系 告触摸行为。

在 Honeycomb 之前,所有触摸设备都被视为具有方向感知功能。

touch.gestureMode

定义:touch.gestureMode = pointer | spots | default

指定指控手势的表示模式。仅在触摸设备为指控类型时,该配置属性才具有相关性。

  • 如果值为 pointer,触摸板手势将通过与鼠标指针类似的光标来表示。

  • 如果值为 spots,触摸板手势将通过代表手势形心的锚点和代表各个手指位置的一组圆形斑点来表示。

如果设置了 INPUT_PROP_SEMI_MT 输入属性,默认值为 pointer,否则为 spots

XY 字段

X 和 Y 字段给出了接触区域中心的位置信息。

计算

计算非常简单:以线性方式将触摸驱动程序的位置信息插入输出坐标系。

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x – raw.x.min) * xScale
output.y = (raw.y – raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y – raw.y.min) * yScale
output.y = (raw.x.max – raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max – raw.x) * xScale
output.y = (raw.y.max – raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max – raw.y) * yScale
output.y = (raw.x – raw.x.min) * xScale
End If

TouchMajorTouchMinorToolMajorToolMinorSize 字段

TouchMajorTouchMinor 字段描述了在输出单元中接触区域的大致尺寸(单位为像素)。

ToolMajorToolMinor 字段描述了在输出单元中工具本身的大致尺寸(单位为像素)。

Size 字段描述了相对于触摸设备可以感知的最大可能触摸区域的标准化触摸区域尺寸。可能的最小标准化尺寸为 0.0(无接触或不可测量),可能的最大标准化尺寸为 1.0(传感器区域已经完全覆盖)。

如果可以同时测量近似长度和宽度,TouchMajor 字段会指定接触区域的较长尺寸,TouchMinor 字段会指定接触区域的较短尺寸。如果只能测量接触区域的大致直径,TouchMajorTouchMinor 字段将相等。

同样,ToolMajor 字段会指定工具截断面的较长尺寸,ToolMinor 字段会指定工具截断面的较短尺寸。

如果触摸尺寸不可测量,但工具尺寸可测量,那么工具尺寸将设为等于触摸尺寸。相反,如果工具尺寸不可测量,但触摸尺寸可测量,那么触摸尺寸将设为等于工具尺寸。

触摸设备以多种方式测量或 告触摸尺寸和工具尺寸。目前的实现支持三种不同的测量方式:Surface 单元内的直径、面积和几何边界框。

touch.size.calibration

定义:touch.size.calibration = none | geometric | diameter | area | default

指定触摸驱动程序 告触摸尺寸和工具尺寸时所用的测量类型。

  • 如果值为 none,那么尺寸设为零。

  • 如果值为 geometric,那么假定以与位置相同的 Surface 单元指定尺寸,从而以相同的方式对尺寸进行缩放。

  • 如果值为 diameter,那么假定尺寸与触摸或工具直径(宽度)成比例。

  • 如果值为 area,那么假定尺寸与触摸或工具面积成比例。

  • 如果值为 default,那么在 raw.touchMajorraw.toolMajor 轴可用的情况下,系统将使用 geometric 校准,否则使用 none 校准。

touch.size.scale

定义:touch.size.scale = <非负浮点数>

指定校准中使用的恒定缩放比例。

默认值为 1.0

touch.size.bias

定义:touch.size.bias = <非负浮点数>

指定校准中使用的恒定偏差值。

默认值为 0.0

touch.size.isSummed

定义:touch.size.isSummed = 0 | 1

指定尺寸是 告为所有有效接触区域的尺寸总和,还是针对每个接触区域单独 告尺寸。

  • 如果值为 1, 告的尺寸需除以接触区域数量,然后才能使用。

  • 如果值为 0, 告的尺寸将按原样使用。

默认值为 0

一些触摸设备(尤其是“Semi-MT”设备)无法区分多个接触区域的单个尺寸,因此它们会 告表示其总面积或总宽度的尺寸测量结果。对于此类设备,此属性只能设为 1。如果不确定,请将此值设为 0

计算

TouchMajorTouchMinorToolMajorToolMinorSize 字段的计算方法取决于指定的校准参数。

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
touchMajor = touchMajor / numberOfActiveContacts
touchMinor = touchMinor / numberOfActiveContacts
toolMajor = toolMajor / numberOfActiveContacts
toolMinor = toolMinor / numberOfActiveContacts
size = size / numberOfActiveContacts
End If

If touch.size.calibration == “none”:
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
Else If touch.size.calibration == “geometric”:
outputScale = average(output.width / raw.width, output.height / raw.height)
touchMajor = touchMajor * outputScale
touchMinor = touchMinor * outputScale
toolMajor = toolMajor * outputScale
toolMinor = toolMinor * outputScale
Else If touch.size.calibration == “area”:
touchMajor = sqrt(touchMajor)
touchMinor = touchMajor
toolMajor = sqrt(toolMajor)
toolMinor = toolMajor
Else If touch.size.calibration == “diameter”:
touchMinor = touchMajor
toolMinor = toolMajor
End If

If touchMajor != 0:
output.touchMajor = touchMajor * touch.size.

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月23日
下一篇 2021年4月23日

相关推荐