实现常量和基本类型

触感常量和基元由振动器 HAL 定义,并由 Android 框架映射到公共 API。执行以下检查以确定您的设备是否满足实现触感的最低要求

Flowchart of the haptics implementation
process

图 2. 实现效果

Flowchart of steps for implementing
primitives

图 3. 实现基元

实现常量

VibrationEffect 中的触感常量可供开发者通过 VibrationEffect.createPredefined() 使用。检查以下触感常量的实现状态。

触感常量 位置和摘要
EFFECT_TICKEFFECT_CLICKEFFECT_HEAVY_CLICKEFFECT_DOUBLE_CLICK VibrationEffect
VibrationEffect 中的触感常量不包含任何输入事件的概念,并且没有 UI 元素。常量包含能量级别的概念,例如 EFFECT_CLICKEFFECT_HEAVY_CLICK,它们由 createPredefined() 调用。

接下来描述的替代振动在未实现 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 中配置的定时。

Flowchart of steps for testing haptic
feedback

图 4. 实现反馈常量

HapticFeedbackConstants 中的触感常量可供开发者通过 View.performHapticFeedback() 使用。检查以下公共反馈常量的状态。

触感常量 位置和摘要
CLOCK_TICKCONTEXT_CLICKKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASECONFIRMREJECTGESTURE_STARTGESTURE_END HapticFeedbackConstants
HapticFeedbackConstants 中的触感常量通过某些 UI 元素辅助输入事件,例如 KEYBOARD_PRESSKEYBOARD_RELEASE,它们由 performHapticFeedback() 调用。

实现基元

VibrationEffect.Composition 中的触感基元具有可伸缩的强度,开发者可以通过 addPrimitive(int primitiveId, float scale, int delay) 使用。基元可以分为两类

  • 短基元:持续时间短的基元,通常小于 20 毫秒。这些是 CLICKTICKLOW_TICK

  • 啁啾基元:具有变化的幅度和频率的基元,通常比短基元持续时间更长。这些是 SLOW_RISEQUICK_RISEQUCK_FALLTHUDSPIN

短基元

短基元可以通过振动器电机输出加速度曲线来描述。所使用的绝对频率因每个基元而异,具体取决于执行器的谐振频率。有关硬件设置和用于测量输出的工具的更多信息,请参阅设置测试设备

短振动的一个重要质量指标是脉冲环比 (PRR),如图 5 所示。PRR 定义为主脉冲环脉冲之间的比率,其中主脉冲由持续时间窗口内的信号定义,在该窗口中,幅度降至峰值幅度的 10%,环脉冲由幅度从峰值幅度的 10% 降至小于峰值幅度的 1% 的信号定义。PRR 的公式为

$$ \text{脉冲环比 (PRR)} = 20log_{10}\frac{\text{RMS (主脉冲)}}{\text{RMS (环)}} $$

有关 PRR 的更多信息,请参阅分析波形,有关分析和比较结果的更多信息,请参阅使用性能图比较结果

Pulse to Ring Ratio

图 5. 脉冲环比定义

应用短基元作为用户输入反馈或在较长的组合中播放以创建柔和的纹理。这意味着它们通常被频繁触发并快速连续播放。单个短基元的感知强度会复合更大的效果强度。因此,校准单个滴答或低滴答基元与较大的组合,例如,100 个连续滴答。

点击基元

点击基元是一种强而清脆的效果,通常在接近设备的谐振频率下工作,以在短时间内达到最大输出。它比其他基元更强更深,以最大强度运行。

如果可用,请在开始时使用电机过驱动,在结束时使用主动制动,以实现较短的电机上升和下降时间。对于某些电机,使用方波代替正弦波可以实现更快的加速度。图 6 显示了点击基元的示例输出加速度曲线

Click primitive output acceleration profile

图 6. 点击基元的示例输出加速度曲线

参数 指南
持续时间

目标:12 毫秒

限制:< 30 毫秒

峰值输出加速度

目标:2 G

限制:> 1 G

频率 大致在谐振频率

滴答基元(轻滴答)

滴答基元是一种尖锐、短暂的效果,通常在更高的频率范围内工作。此基元也可以描述为较高频率下的中等强度点击,具有短尾。相同的指导适用于使用电机过驱动或方波实现初始 onset 的短上升时间,以及在 offset 处进行主动制动。图 7 显示了滴答基元的示例输出加速度曲线

Tick primitive output acceleration profile

图 7. 滴答基元的示例输出加速度曲线

参数 指南
持续时间

目标:5 毫秒

限制:< 20 毫秒

峰值输出加速度

目标:CLICK 的一半,1 G

限制:介于 0.5 G 和 1 G 之间

频率

目标:2 倍谐振频率

限制:< 500 赫兹

低滴答基元

低滴答基元是轻滴答的更柔和、更弱的版本,在较低的频率范围内工作,为效果提供更多的主体感。此基元也可以描述为较低频率下的中等强度点击,旨在重复用于动态反馈。相同的指导适用于使用电机过驱动或方波实现初始 onset 的短上升时间。图 8 显示了低滴答基元的示例输出加速度曲线

Low tick primitive output acceleration profile

图 8. 低滴答基元的示例输出加速度曲线

参数 指南
持续时间

目标:12 毫秒

限制:< 30 毫秒

峰值输出加速度

目标:TICK 的 1/4,0.25 G

限制:介于 0.2 G 和 0.5 G 之间

频率

目标:2/3 谐振频率

限制:< 100 赫兹

啁啾基元

啁啾基元可以通过电压电平和振动频率的输入信号来描述。电机在不同频率范围内能够输出的加速度因执行器的频率响应曲线而异。频率范围和电压电平需要根据每个设备进行调整。

慢速上升基元

慢速上升是幅度和频率缓慢向上扫描,具有柔和的 onset,并且在整个扫描过程中振动强度持续增加。它可以通过幅度和频率的一致扫描来实现,使用在谐振之外工作的较低频率范围。图 9 显示了此实现的输入参数和示例输出加速度曲线。(红线与左侧的幅度标签匹配,表示振动幅度随时间变化的方式。蓝线与右侧的频率标签匹配,表示振动频率随时间变化的方式。)

Input parameters and output acceleration profile for slow rise primitive

图 9. 慢速上升基元的输入参数和示例输出加速度曲线

如果电机的频率响应受到限制(在其谐振频率之外不够强),则另一种实现是从谐振频率的 1/2 倍到 1 倍的正弦扫描。电机谐振有助于在末端达到信号峰值。

参数 指南
持续时间

目标:500 毫秒

容差:20 毫秒

峰值输出加速度

目标:0.5 G

限制:介于 0.5 G 和 1 G 之间

频率

目标:谐振频率的 1/2 到 2/3

替代方案:1/2 到谐振频率

快速上升基元

快速上升是幅度和频率更快速地向上扫描,具有柔和的 onset,并且在整个扫描过程中振动强度持续增加。输出加速度和振动频率目标应与慢速上升基元相同,在较短的持续时间内实现。图 10 显示了慢速上升基元的振动输入参数和示例输出加速度曲线。(红线与左侧的幅度标签匹配,表示振动幅度随时间变化的方式。蓝线与右侧的频率标签匹配,表示振动频率随时间变化的方式。)

Input parameters and output acceleration profile for quick rise primitive

图 10. 快速上升基元的输入参数和示例输出加速度曲线

参数 指南
持续时间

目标:150 毫秒

容差:20 毫秒

峰值输出加速度

目标:与 SLOW_RISE 相同

限制:与 SLOW_RISE 相同

频率

目标:与 SLOW_RISE 相同

替代方案:与 SLOW_RISE 相同

快速下降基元

快速下降是幅度和频率快速向下扫描,具有柔和的 onset。当电机加速以达到峰值输出加速度时,可以使用更高的频率作为起点。即使在上升时间内,频率也应在整个扫描过程中持续降低。图 11 显示了此实现的输入参数和示例输出加速度曲线。(红线与左侧的幅度标签匹配,表示振动幅度随时间变化的方式。蓝线与右侧的频率标签匹配,表示振动频率随时间变化的方式。)

Input parameters and output acceleration profile for quick fall primitive

图 11. 快速下降基元的输入参数和示例输出加速度曲线

参数 指南
持续时间

目标:100 毫秒

容差:20 毫秒

峰值输出加速度

目标:1 G

限制:介于 0.5 G 和 2 G 之间

频率

目标:谐振频率的 2 倍到 1 倍

撞击声基元

撞击声是一种沉闷、低沉的敲击效果,模拟敲击空心木头的物理感觉。此基元在低频率范围内工作,类似于低滴答基元,为效果提供更多的身体感。可以将撞击声基元实现为较低频率范围(最好小于 100 赫兹)内的幅度和频率向下扫描。图 12 显示了此实现的输入参数和示例输出加速度曲线。(红线与左侧的幅度标签匹配,表示振动幅度随时间变化的方式。蓝线与右侧的频率标签匹配,表示振动频率随时间变化的方式。)

Input parameters and output acceleration profile for thud primitive

图 12. 撞击声基元的输入参数和示例输出加速度曲线

如果电机的频率响应受到限制,则另一种实现是以谐振频率开始全强度驱动信号,然后降至仍然可以感知的最低频率。这种方法可能需要在较低频率下增加驱动信号强度,才能感觉到振动。

参数 指南
持续时间

目标:300 毫秒

容差:20 毫秒

峰值输出加速度

目标:0.25 G

限制:介于 0.2 G 和 0.5 G 之间

频率

目标:谐振频率的 1/2 到 1/3

替代方案:谐振频率的 1 倍到 1/2

旋转基元

旋转模拟快速上下旋转的旋转动量,中心略有强调。旋转可以通过独立扫描幅度和频率来实现,方向相反,然后是反向运动。重要的是使用较低的频率范围(最好小于 100 赫兹)。图 13 显示了此实现的输入参数和示例输出加速度曲线。(红线与左侧的幅度标签匹配,表示振动幅度随时间变化的方式。蓝线与右侧的频率标签匹配,表示振动频率随时间变化的方式。)

我们建议连续调用两次旋转基元,或在组合中调用三次,以实现旋转和不稳定的感觉。

如果电机的频率响应受到限制,则另一种实现是从谐振频率的 1/2 倍到 1 倍快速正弦扫描,然后再返回。电机谐振自动使信号在中间产生强调。

Input parameters and output acceleration profile for spin primitive

图 13. 旋转基元的输入参数和示例输出加速度曲线

参数 指南
持续时间

目标:150 毫秒

容差:20 毫秒

峰值输出加速度

目标:0.5 G

限制:介于 0.25 G 和 0.75 G 之间

频率

目标:谐振频率的 2/3 到 1/3,然后返回到 1/2

替代方案:谐振频率的 2/3 到 1 倍,然后返回到 1/2