分析振动波形

Android 设备上最常见的振动致动器是线性共振致动器 (LRA)。LRA 可模拟在玻璃表面上点击按钮的感觉,而玻璃表面本身没有任何响应。清晰、响亮的点击反馈信号通常持续 10 到 20 毫秒。这种感觉让用户互动感觉更自然。对于虚拟键盘,这种点击反馈可以提高打字速度并减少错误。

LRA 具有几个常见的共振频率

  • 某些 LRA 的共振频率在 200 到 300 Hz 之间,这与人体皮肤对振动最敏感的频率一致。在这个频率范围内,振动感觉通常被描述为平滑、尖锐且穿透性强。
  • 其他型号的 LRA 的共振频率较低,约为 150 Hz。从感官上来说,这种感觉更柔和、更饱满(在维度上)。
组件包括(从上到下)盖子、板、中间磁铁、2 个侧边磁铁、质量块、2 个弹簧、线圈、柔性电路板、底板和粘合剂。
线性共振致动器 (LRA) 的组件。

在两个不同频率下使用相同的输入电压时,振动输出幅度可能会有所不同。频率离 LRA 的共振频率越远,其振动幅度就越小。

给定设备的触感反馈效果同时使用振动致动器及其驱动程序。包含过载和主动制动功能的触感反馈驱动程序可以缩短 LRA 的上升时间和振铃时间,从而实现更灵敏、更清晰的振动。

设备上的默认波形平滑

举例来说,请考虑自定义波形模式在通用设备上的行为方式:

Kotlin

val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

以下图表显示了与上述代码段对应的输入波形和输出加速度。请注意,每当模式中的振幅发生阶跃变化时(即 0 毫秒、150 毫秒、200 毫秒、250 毫秒和 700 毫秒),加速度都会逐渐增加,而不是突然增加。此外,振幅的每个步骤变化都会出现过冲,并且当输入振幅突然下降到 0 时,会出现明显的铃声,持续时间至少为 50 毫秒。

阶跃函数输入波形图。
实际测量波形的图表,显示了各个音量级别之间更自然的过渡。

改进了触感反馈模式

为避免过冲并缩短振铃时间,请更缓慢地更改振幅。以下是修订版的波形和加速度图:

Kotlin

val timings: LongArray = longArrayOf(
    25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
    300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
    38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
    0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] {
        25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
        300, 25, 25, 150, 25, 25, 25
    };
int[] amplitudes = new int[] {
        38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
        0, 85, 170, 255, 170, 85, 0
    };
int repeatIndex = -1; // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

包含额外步骤的输入波形图。
测量波形的图表,显示更流畅的过渡。

创建更复杂的触感反馈效果

令人满意的点击响应中的其他元素更为复杂,需要对设备中使用的 LRA 有一定的了解。为了获得最佳效果,请使用设备的预构建波形和平台提供的常量,以便执行以下操作:

  • 执行清晰的效果和基元
  • 将它们串联起来,组合出新的触感反馈效果。

这些预定义的触感反馈常量和基元可以大大加快您的工作速度,同时创建高品质的触感反馈效果。