振动致动器入门

在 Android 设备上设计触感反馈效果之前,最好先大致了解振动致动器的工作原理。

触感反馈 LRA 组件图示

最常见的振动致动器是线性共振致动器 (LRA)。每个 LRA 都由一个与弹簧相连的磁移动质量按压的音圈组成。施加到音圈的交流电压会产生电磁力,使质量移动。弹簧提供的恢复力会使质量回到起始位置。质量的来回移动会导致 LRA 振动。它们具有输出最大共振频率。

如果输入电压在两种不同频率下保持不变,则振动输出振幅可能会有所不同。频率离 LRA 的共振频率越远,其振动振幅越低。

LRA 在设备中的一种常见功能是模拟按按钮时无响应的玻璃表面的感觉。它能让用户感觉互动更自然。当应用于虚拟键盘上的输入时,点击反馈可以提高输入速度并减少错误。清晰清晰的点击反馈信号的时长通常少于 10 到 20 毫秒。要想实现良好的点击,需要对设备中使用的 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 // Do not 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 // Do not repeat.

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

下图显示了与上面所示代码段对应的波形。

步进函数输入波形图

相应的加速度如下所示:

实际测量波形的图,显示了声层之间更多有机过渡的图

请注意,每当模式中的振幅有步进变化时(例如,在 0ms、150ms、200ms、250ms、700ms 时),加速度都是逐渐增加的,而不是突然增加。每步振幅变化也有过冲,当输入振幅突然下降到 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));

包含额外步骤的输入波形图

测量的波形图,显示了更平滑的过渡

由此可见,在 Android 设备上创建触感反馈效果不仅仅是提供频率和振幅值。在并不完全访问振动致动器和驱动单元的工程规范的情况下,从头开始设计触感反馈效果并非易事。Android API 提供了常量,可用于执行以下操作:

  • 实现清晰的效果和基元

  • 将它们串联起来以构成新的触感反馈效果。

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