实现触觉

设备制造商通常被认为是为每个设备创建的私有资产的所有者。因此,他们的工程工作通常集中在每个设备的基础上;生态系统中其他设备的一致性几乎没有任何努力。

与此形成鲜明对比的是,开发人员努力构建适用于生态系统中所有Android 手机的应用程序,而不管每台设备的技术规格如何。这种方法上的差异可能会导致碎片化问题,例如,某些手机的硬件功能与应用程序开发人员设定的预期不符。因此,如果触觉 API 在某些 Android 手机上工作但在其他手机上不工作,结果就是一个不一致的生态系统。这就是硬件配置在确保制造商能够在每台设备上实施 Android 触觉 API 方面发挥关键作用的原因。

此页面提供了一个分步清单,用于设置硬件合规性以最佳使用 Android 触觉 API。

下图说明了在设备制造商和开发人员之间建立共同知识,这是创建有凝聚力的生态系统的关键步骤。

应用程序开发人员和设备制造商的触觉用例图

图 1.在设备制造商和开发人员之间建立知识

触觉实施清单

  1. 实现常量

    • 实现触觉的常量列表。
  2. 在 HAL 和 API 之间映射常量

    • 公共 API 常量(框架中的命名占位符)和实现占位符的 HAL 常量之间的映射建议。
    • 请参阅指导推荐映射的设计原则以了解有关此过程的更多信息。
  3. 评估硬件

    • 有关目标触觉效果的说明。使用这些说明对您的硬件执行快速检查。

我们将在下面更详细地探讨这些步骤中的每一个。

第 1 步:实现常量

执行这些检查以确定您的设备是否满足实现触觉的最低要求。

触觉实现过程流程图

图 2.实施效果

实现原语的步骤流程图

图 3.实现原语

检查以下触觉常量的实现状态。

触觉常量位置和摘要
EFFECT_TICKEFFECT_CLICKEFFECT_HEAVY_CLICKEFFECT_DOUBLE_CLICK VibrationEffect
VibrationEffect中的触觉常量不包含任何输入事件的概念,并且没有 UI 元素。常数包括能量水平的概念,例如EFFECT_CLICKEFFECT_HEAVY_CLICK ,它们由createPredefined()调用。
PRIMITIVE_TICKPRIMITIVE_CLICKPRIMITIVE_LOW_TICK>PRIMITIVE_SLOW_RISEPRIMITIVE_QUICK_RISEPRIMITIVE_QUICK_FALLPRIMITIVE_SPINPRIMITIVE_THUD VibrationEffect.Composition
VibrationEffect.Composition中的触觉常量允许具有可缩放的强度,由addPrimitive(int primitiveId, float scale, int delay)调用。

下面描述的替代振动将在未实现VibrationEffect常量的设备上执行。建议更新这些配置以在此类设备上发挥最佳性能。

  1. EFFECT_CLICK

    使用VibrationEffect.createWaveform创建的波形振动和在frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern中配置的时序。

  2. EFFECT_HEAVY_CLICK

    使用VibrationEffect.createWaveform创建的波形振动和在frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern中配置的时序。

  3. EFFECT_DOUBLE_CLICK

    使用VibrationEffect.createWaveform和计时 (0, 30, 100, 30) 创建的波形振动。

  4. EFFECT_TICK

    使用VibrationEffect.createWaveform创建的波形振动和在frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern中配置的时序。

测试触觉反馈的步骤流程图

图 4.实现反馈常量

检查以下公共反馈常量的状态。

触觉常量位置和摘要

CLOCK_TICKCONTEXT_CLICKKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASECONFIRMREJECTGESTURE_STARTGESTURE_END

HapticFeedbackConstants
HapticFeedbackConstants中的触觉常量通过某些 UI 元素协助输入事件,例如KEYBOARD_PRESSKEYBOARD_RELEASE ,它们由performHapticFeedback()调用。

第 2 步:在 HAL 和 API 之间映射常量

第 2 步展示了公共 HAL 常量和 API 常量之间的推荐映射。如果在步骤 1 中评估的硬件未实现 HAL 常量,则应使用步骤 2 更新步骤 1 中描述的回退模式,以生成类似的输出。映射由两个不同的默认模型辅助。

  • 离散模型(简单)

    • 振幅是该模型的关键变量。 HAL 中的每个实体代表不同的触觉振幅。
    • 此模型是实现基本触觉 UX 所需的最低要求。
    • 更高级的触觉 UX 需要高级硬件和高级模型(连续模型)。
  • 连续模型(高级)

    • 纹理和振幅是该模型的关键变量。 HAL 中的每个实体代表不同的触觉纹理。每个 HAL 实体的振幅由比例因子 ( S ) 控制。
    • 此模型需要高级硬件。如果 OEM 想要使用带有VibrationEffect.Composition的高级触觉 UX(为了最好地使用最新的触觉 API),建议使用此模型实现他们的硬件。

离散模型

建议将 API 中提供的所有公共常量映射到适当的 HAL 常量。要开始此过程,请找出设备可以在 HAL 中定义多少具有离散振幅的触觉波形。围绕该概念构建的具体问题如下所示:在我的手机中可以定义多少具有人类可感知幅度差异的单脉冲触觉效果?这个问题的答案决定了映射。

定义 HAL 常量是一个依赖于硬件的过程。例如,入门级手机可能只有产生单一触觉波形的硬件功能。具有更高级硬件组件的设备会产生更广泛的离散振幅水平,并且可以在 HAL 中定义多个触觉波形。 HAL-API 常量映射采用 HAL 常量(使用中等振幅作为基线),然后从那里安排更强或更弱的效果。

HAL恒定范围和反馈幅度图

图 5. HAL 常数范围(按振幅)

当定义了具有离散振幅的 HAL 常量的数量后,就可以通过 HAL 常量的数量来映射 HAL 和 API 常量了。此映射过程可以将单个脉冲 API 常数分割成最多三个离散的幅度级别组。 API 常量的分段方式基于伴随输入事件的 UX 原则。有关详细信息,请参阅触觉 UX 设计

HAL-API 常量映射的离散模型

图 6. HAL-API 常量映射:离散模型

如果您的设备仅支持两个具有离散振幅的 HAL 常量,请考虑合并中等和高振幅级别的 HAL 常量。这个概念在实践中的一个例子是将EFFECT_CLICKEFFECT_HEAVY_CLICK映射到相同的 HAL 常量,这将是中等振幅级别的 HAL 常量。如果您的设备仅支持一个具有离散振幅的 HAL 常量,请考虑将所有三个级别合并为一个。

连续模型

具有振幅可伸缩性的连续模型可用于定义 HAL 常量。比例因子 ( S ) 可以应用于 HAL 常量(例如, HAL_H0HAL_H1 )以生成缩放的 HAL ( HAL_H0 x S )。在这种情况下,缩放的 HAL 被映射为定义 API 常量 ( HAL_H0 x S1 = H0S1 = EFFECT_TICK ),如图 7 所示。通过使用连续模型的振幅可缩放性,设备可以存储少量具有独特纹理的 HAL 常量并通过调整比例因子 ( S ) 添加幅度变化。设备制造商可以根据他们想要提供的不同触觉纹理的数量来定义 HAL 常量的数量。

按纹理和振幅划分的 HAL 恒定范围

图 7.按纹理 (HAL_H0) 和振幅比例 (S) 划分的 HAL 常数范围

HAL-API 常量映射的连续模型

图 8. HAL-API 常量映射:连续模型

在连续模型中,不同的 HAL 常数代表不同的触觉纹理而不是不同的振幅;比例因子 ( S ) 可以配置振幅。但是,由于纹理的感知(例如锐度)与持续时间和幅度的感知相关,因此建议将纹理和比例因子结合(在HAL-API映射的设计过程中)。

图 7 通过增加从一个 HAL 到许多具有幅度可扩展性的 API 常量的变化来说明常量映射。

增加变化 1

增加变化 2

图 9.随振幅可缩放性增加变化

注意:上图展示了常量映射的具体实例,因此命名约定是假设的。执行此过程对于每个设备制造商都是独一无二的。

对于所有可扩展的 API 常量,例如VibrationEffect.Composition中的PRIMITIVE_TICKPRIMITIVE_CLICK ,当通过addPrimitive(int primitiveID, float scale, int delay)声明 API 常量时,API 常量的能级取决于float scale参数。 PRIMITIVE_TICKPRIMITIVE_CLICK可以通过使用不同的 HAL 常量来设计,具有明显的区别。如果您想为纹理添加变化,建议使用此方法。

第 3 步:评估硬件

硬件评估涉及为该特定评估定义三种触觉效果,标记为效果 1、2 和 3。

效果 1:预定义的短触觉常量

VibrationEffect.EFFECT_CLICK常量是第 2 步中提供的 HAL-API 映射中的基线效果或公分母。它映射到最常用的效果HapticFeedbackConstants.KEYBOARD_PRESS 。评估这种效果有助于确定您的目标设备是否准备好获得清晰的触觉

效果 2:简短的自定义触觉效果

VibrationEffect.createOneShot(20,255)常量用于自定义触觉效果。对于简短的单个自定义脉冲,建议使用 20 毫秒来定义持续时间的最大阈值。不建议使用超过 20 毫秒的单个脉冲,因为它会被视为嗡嗡声

短自定义触觉效果的波形

图 10.简短的自定义触觉效果

效果 3:带有振幅变化的长自定义触觉效果

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat)常量用于具有振幅变化的长自定义效果。为自定义触觉效果产生不同振幅的能力是评估设备丰富触觉功能的指标之一。推荐的timings []amplitudes []分别为{500, 500}{128, 255} ,振幅从 50% 到 100% 呈递增趋势,采样率为 500 ms。

振幅变化的触觉效果波形

图 11.幅度变化的长自定义触觉效果

要检查效果 3 的振幅控制的硬件功能,请使用Vibrator.hasAmplitudeControl()方法。结果必须为true才能按预期以不同的振幅执行VibrationEffect.createWaveform

主观触觉效果评估流程图

图 12.受试者对触觉效果 1、2 和 3 的评估

进行主观评估

要进行快速一致性检查,请先进行主观评估。主观评估的目标是观察触觉效果的幅度,以确定设备是否可以产生具有人类可感知幅度的触觉。

围绕这个概念构建的具体问题如下所示:设备能否按预期为用户产生易于感知的触觉效果?回答这个问题可以帮助您避免失败的触觉,包括用户感觉不到的难以察觉的触觉,或波形未按预期产生模式的意外触觉。