实现触感反馈

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

与此形成鲜明对比的是,开发人员努力构建适用于生态系统中所有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 中的每个实体代表不同的触觉幅度。
    • 该模型是实现基本触觉用户体验所需的最低要求。
    • 更先进的触觉用户体验需要先进的硬件和先进的模型(连续模型)。
  • 连续模型(高级)

    • 纹理和振幅是该模型的关键变量。 HAL 中的每个实体代表不同的触觉纹理。每个 HAL 实体的幅度由比例因子 ( S ) 控制。
    • 该模型需要先进的硬件。如果 OEM 希望将高级触觉 UX 与VibrationEffect.Composition结合使用(为了充分利用最新的触觉 API),建议使用此模型来实现其硬件。

离散模型

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

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

HAL 恒定范围和反馈幅度图

图 5.按幅度划分的 HAL 常数范围

当定义了具有离散幅度的 HAL 常量的数量后,就可以通过 HAL 常量的数量来映射 HAL 和 API 常量了。该映射过程可以将单个脉冲 API 常数分割为最多三个离散的幅度级别组。 API 常量的分段方式基于伴随输入事件的 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.幅度可扩展性增加变化

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

第 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.具有幅度变化的长自定义触觉效果

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

主观触觉效果评估流程图

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

进行主观评估

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

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