设备制造商通常被认为是为每个设备创建的私有资产的所有者。因此,他们的工程工作通常集中在每个设备的基础上;生态系统中其他设备的一致性几乎没有付出任何努力。
与此形成鲜明对比的是,开发人员努力构建适用于生态系统中所有Android 手机的应用程序,无论每台设备的技术规格如何。这种方法上的差异可能会导致碎片问题,例如,某些手机的硬件功能与应用程序开发人员设定的期望不符。因此,如果触觉 API 在某些 Android 手机上工作,但在其他手机上不工作,就会导致生态系统不一致。这就是为什么硬件配置在确保制造商可以在每台设备上实现 Android 触觉 API 方面发挥着关键作用。
此页面提供了一个分步清单,用于设置硬件合规性,以最佳地利用 Android 触觉 API。
下图说明了设备制造商和开发人员之间建立共同知识的过程,这是创建有凝聚力的生态系统的关键一步。
图 1.在设备制造商和开发人员之间构建知识
触觉实施清单
- 实现触觉的常量列表。
- 公共 API 常量(框架中的命名占位符)和实现占位符的 HAL 常量之间的映射建议。
- 请参阅设计原则来指导建议的映射,以了解有关此过程的更多信息。
- 有关目标触觉效果的说明。使用这些说明对您的硬件执行快速检查。
我们将在下面更详细地探讨每个步骤。
第 1 步:实现常量
执行这些检查以确定您的设备是否满足实现触觉的最低要求。
图2实施效果
图 3.实现原语
检查以下触觉常量的实施状态。
触觉常数 | 地点和摘要 |
---|---|
EFFECT_TICK 、 EFFECT_CLICK 、 EFFECT_HEAVY_CLICK 、 EFFECT_DOUBLE_CLICK | VibrationEffect 类VibrationEffect 中的触觉常量不包含任何输入事件的概念,并且没有 UI 元素。常量包括能量级别的概念,例如EFFECT_CLICK 和EFFECT_HEAVY_CLICK ,它们由createPredefined() 调用。 |
PRIMITIVE_TICK 、 PRIMITIVE_CLICK 、 PRIMITIVE_LOW_TICK> 、 PRIMITIVE_SLOW_RISE 、 PRIMITIVE_QUICK_RISE 、 PRIMITIVE_QUICK_FALL 、 PRIMITIVE_SPIN 、 PRIMITIVE_THUD | VibrationEffect.Composition 类VibrationEffect.Composition 中的触觉常量允许具有可缩放强度,由addPrimitive(int primitiveId, float scale, int delay) 调用。 |
下面描述的替代振动将在未实现VibrationEffect
常量的设备上执行。建议更新这些配置以在此类设备上发挥最佳性能。
EFFECT_CLICK
使用
VibrationEffect.createWaveform
创建的波形振动以及在frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern
中配置的计时。EFFECT_HEAVY_CLICK
使用
VibrationEffect.createWaveform
创建的波形振动以及在frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern
中配置的计时。EFFECT_DOUBLE_CLICK
使用
VibrationEffect.createWaveform
和计时(0、30、100、30)创建的波形振动。EFFECT_TICK
使用
VibrationEffect.createWaveform
创建的波形振动以及在frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern
中配置的计时。
图 4.实现反馈常量
检查以下公共反馈常量的状态。
触觉常数 | 地点和摘要 |
---|---|
| HapticFeedbackConstants 类HapticFeedbackConstants 中的触觉常量通过某些 UI 元素(例如KEYBOARD_PRESS 和KEYBOARD_RELEASE 辅助输入事件,这些元素由performHapticFeedback() 调用。 |
第 2 步:在 HAL 和 API 之间映射常量
步骤 2 显示公共 HAL 常量和 API 常量之间的推荐映射。如果步骤 1 中评估的硬件未实现 HAL 常量,则应使用步骤 2 更新步骤 1 中描述的回退模式,以便生成类似的输出。映射由两个不同的默认模型辅助。
离散模型(简单)
- 幅度是该模型的关键变量。 HAL 中的每个实体代表不同的触觉幅度。
- 该模型是实现基本触觉用户体验所需的最低要求。
- 更先进的触觉用户体验需要先进的硬件和先进的模型(连续模型)。
连续模型(高级)
- 纹理和振幅是该模型的关键变量。 HAL 中的每个实体代表不同的触觉纹理。每个 HAL 实体的幅度由比例因子 (
S
) 控制。 - 该模型需要先进的硬件。如果 OEM 希望将高级触觉 UX 与
VibrationEffect.Composition
结合使用(为了充分利用最新的触觉 API),建议使用此模型来实现其硬件。
- 纹理和振幅是该模型的关键变量。 HAL 中的每个实体代表不同的触觉纹理。每个 HAL 实体的幅度由比例因子 (
离散模型
建议将 API 中提供的所有公共常量映射到适当的 HAL 常量。要开始此过程,请找出设备可以在 HAL 中定义多少个具有离散幅度的触觉波形。围绕该概念构建的一个具体问题如下:可以在我的手机中定义多少个具有人类可感知幅度差异的单脉冲触觉效果?这个问题的答案决定了映射。
定义 HAL 常量是一个依赖于硬件的过程。例如,入门级手机可能仅具有产生单个触觉波形的硬件功能。具有更先进硬件组件的设备可产生更广泛的离散幅度级别,并且可以在 HAL 中定义多个触觉波形。 HAL-API 常量映射采用 HAL 常量(使用中等幅度作为基线),然后从那里安排更强或更弱的效果。
图 5.按幅度划分的 HAL 常数范围
当定义了具有离散幅度的 HAL 常量的数量后,就可以通过 HAL 常量的数量来映射 HAL 和 API 常量了。该映射过程可以将单个脉冲 API 常数分割为最多三个离散的幅度级别组。 API 常量的分段方式基于伴随输入事件的 UX 原则。有关更多信息,请参阅触觉用户体验设计。
图 6. HAL-API 常量映射:离散模型
如果您的设备仅支持两个具有离散幅度的 HAL 常量,请考虑合并中幅度和高幅度级别的 HAL 常量。实践中此概念的一个示例是将EFFECT_CLICK
和EFFECT_HEAVY_CLICK
映射到相同的 HAL 常量,该常量将是中等幅度级别 HAL 常量。如果您的设备仅支持一个具有离散幅度的 HAL 常量,请考虑将所有三个级别合并为一个。
连续模型
具有幅度可扩展性的连续模型可用于定义 HAL 常数。比例因子 ( S
) 可以应用于 HAL 常量(例如HAL_H0
、 HAL_H1
)以生成缩放后的 HAL ( HAL_H0
x S
)。在这种情况下,缩放后的 HAL 被映射以定义 API 常量 ( HAL_H0
x S1
= H0S1
= EFFECT_TICK
),如图 7 所示。通过使用连续模型的幅度可伸缩性,设备可以存储少量具有独特纹理的 HAL 常量并通过调整比例因子( S
)来添加幅度变化。设备制造商可以根据他们想要提供多少种不同的触觉纹理来定义 HAL 常量的数量。
图 7.按纹理 (HAL_H0) 和幅度比例 (S) 划分的 HAL 常数范围
图 8. HAL-API 常量映射:连续模型
在连续模型中,不同的HAL常数代表不同的触觉纹理而不是不同的幅度;比例因子( S
)可以配置幅度。然而,由于纹理的感知(例如清晰度)与持续时间和幅度的感知相关,因此建议将纹理和比例因子结合起来(在HAL-API映射的设计过程中)。
图 7 说明了通过增加从一个 HAL 到多个具有幅度可扩展性的 API 常量的变化来进行常量映射。
图 9.幅度可扩展性增加变化
注意:上图说明了常量映射的具体实例,因此命名约定是假设的。对于每个设备制造商来说,执行此过程都是独一无二的。
对于VibrationEffect.Composition
中的所有可扩展 API 常量(例如PRIMITIVE_TICK
和PRIMITIVE_CLICK
,当通过addPrimitive(int primitiveID, float scale, int delay)
声明 API 常量时,API 常量的能量级别取决于float scale
参数。通过使用不同的 HAL 常量,可以将PRIMITIVE_TICK
和PRIMITIVE_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 的评估
进行主观评估
为了快速检查一致性,首先进行主观评估。主观评估的目标是观察触觉效果的幅度,以确定设备是否能够产生具有人类可感知幅度的触觉。
围绕这个概念构建的一个具体问题如下:设备能否按照预期为用户产生易于感知的触觉效果?回答这个问题可以帮助您避免失败的触觉,包括用户感觉不到的难以察觉的触觉,或波形未按预期产生模式的意外触觉。