在 Android 设备上设计触感反馈效果之前,最好先大致了解振动致动器的工作原理。
最常见的振动致动器是线性共振致动器 (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 提供了常量,可用于执行以下操作:
实现清晰的效果和基元。
将它们串联起来以构成新的触感反馈效果。
这些预定义的触感反馈常量和基元可以大大加快您的工作速度,同时确保高质量的触感反馈效果。