震動致動器入門

在 Android 裝置上設計觸覺效果之前,建議您先瞭解震動致動器的運作方式。

觸動式 LRA 成分的插圖

最常見的振動致動器是線性共振器 (LRA)。每個 LRA 都包含一個語音線圈,對夾在彈簧的磁力移動質量上按下。套用至語音線圈的 AC 電壓會產生電磁力,導致質量移動。彈簧可提供還原力,促使質量回到起始位置。質量的來回移動會使 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));

下圖顯示與上述程式碼片段對應的波形。

繪製步數函式輸入波形

相應的加速器如下所示:

繪製實際測量的波形圖,顯示各關卡間的自然轉換數

請注意,每當模式中的振幅變化 (例如 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));

以額外步驟繪製輸入波形

繪製測量波形圖,呈現更流暢的轉場效果

比起提供頻率和振幅值,在 Android 裝置上建立觸覺效果的前提是。在沒有震動致動器和驅動程式的工程規格的情況下,從頭開始設計觸覺效果並不容易。Android API 提供的常數可讓您執行下列操作:

  • 執行清晰的特效和原始物件

  • 串連後即可撰寫新的觸覺效果。

這些預先定義的觸覺常數和基元可以大幅加快工作速度,同時確保高品質的觸覺效果。