振動の波形を分析する

Android デバイスで最も一般的な振動アクチュエータは、リニア共振アクチュエータ(LRA)です。LRA は、通常は反応しないガラス面でボタンを押した感覚をシミュレートします。明確で鮮明なクリック フィードバック シグナルは、通常 10 ~ 20 ミリ秒の長さです。この感覚により、ユーザー操作がより自然に感じられます。仮想キーボードの場合、このクリック フィードバックにより、タイピング速度が向上し、エラーが減ります。

LRA には、いくつかの一般的な共振周波数があります。

  • 一部の LRA の共振周波数は 200 ~ 300 Hz の範囲にあり、これは人間の皮膚が振動に対して最も敏感になる周波数と一致します。この周波数帯域での振動の感覚は、通常、滑らかで鋭く、浸透力があると表現されます。
  • 他のモデルの LRA の共振周波数は 150 Hz 程度と低く、感覚的には柔らかく、より豊かな音質(音域)です。
コンポーネントは、上から下に向かって、カバー、プレート、中央のマグネット、2 つの側面マグネット、質量、2 つのスプリング、コイル、フレキシブル回路、ベース、接着剤です。
リニア共振アクチュエータ(LRA)のコンポーネント。

2 つの異なる周波数で同じ入力電圧が与えられた場合、振動出力の振幅は異なる場合があります。周波数が 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));

次のグラフは、上記のコード スニペットに相当する入力波形と出力加速度を示しています。パターンの振幅が急激に変化すると(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));

追加のステップを含む入力波形のグラフ。
測定された波形のグラフ。スムーズな遷移を示しています。

より複雑な触覚効果を作成する

満足のいくクリック レスポンスの他の要素はより複雑で、デバイスで使用される LRA に関する知識が必要です。最良の結果を得るには、デバイスの事前作成された波形とプラットフォーム提供の定数を使用します。これにより、次のことができます。

  • 明確な効果とプリミティブを実行します。
  • 連結して新しいハプティクス エフェクトを作成します。

これらの事前定義されたハプティクス定数とプリミティブを使用すると、高品質のハプティクス エフェクトを作成しながら、作業を大幅にスピードアップできます。