Android - 振動、Vibrator、VibrationEffectの例

By JS | Last updated: March 27, 2022

アプリはVibratorServiceを介してデバイスを振動させることができます。

AndroidバージョンごとにAPIの変更があり、以前のSDKの実装方法から最近(Android 12以降)SDKの実装方法をすべて紹介します。

自分のアプリがSDK API 30(Android 12)以上にコンパイルされている場合は、レガシーの例を見てみてください。Android 12のサンプルコードをご覧ください。

1.バイブレーター의SDKAPIの履歴

これまでAndroidバージョンアップデートによるVibrator APIの変更簡単にまとめました。

1.1 Android O(API 26)未満

Android O(API 26)未満のバージョンでは、Vibratorが提供されており、次のAPIを使用して振動を発生させました。これらのAPIはAndroid OでDeprecatedされています。

  • Vibrator.vibrate(long milliseconds)
  • Vibrator.vibrate(long[] pattern, int repeat)

1.2 Android O(API 26)以上、Android 11(API 30)以下

Android O(API 26)以降では、VibrationEffectを引数として渡される Vibrate() API が追加され、これを使って振動を発生させるように推奨しています。

  • Vibrator.vibrate(VibrationEffect vibe)

1.3 Android 12(API 31)以上

Android 12ではVibratorがdeprecatedされました。代わりにVibratorManagerが追加されました。将来VibratorManagerを使用する必要があります。

2. Example: vibrate() を使用した振動発生 (API 26 未満)

Target SDK APIごとに、振動を発生させる例を紹介します。

Vibrator オブジェクトは次のように取得できます。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

Vibrator.vibrator() API は以下の機能を提供します。

  • 振動発生(1回
  • パターン振動発生(1回
  • 振動半

完全なコードはGitHub - Vibrationで確認できます。

2.1振動発生(1回)

vibrate()で時間を引数に渡すと、その時間だけ振動が発生します。時間の単位はミリ秒です。

次のコードを実行すると、200msの振動が1回発生します。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(200) // 200 ms

2.2パターン振動発生(1回)

次のようにパターン配列を引数に渡すと、入力されたパターンで振動が発生します。 2番目の引数は反復を意味し、0が反復、-1は反復しないことを意味します。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val pattern = longArrayOf(100, 200, 100, 200, 100, 200)
vibrator.vibrate(pattern, -1)

パターン配列において、偶数インデックスは待機する時間であり、奇数インデックスは振動が発生する時間を意味する。

Index 0: 100  // wait for 100ms
Index 1: 200  // vibrate for 200ms
Index 2: 100  // wait for 100ms
Index 3: 200  // vibrate for 200ms
Index 4: 100  // wait for 100ms
Index 5: 200  // vibrate for 200ms

2.3 振動の繰り返し

以下のコードはパターン振動が発生し、無限に振動を発生させます。引数 Repeat = 0 は無限に繰り返すという意味です。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val pattern = longArrayOf(100, 200, 100, 200, 100, 200)
vibrator.vibrate(pattern, 0)

繰り返しを止めるには、次のように cancel() を呼び出すだけです。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()

2.4 振動のキャンセル

繰り返しを止めたり振動をキャンセルしたりするには、次のように cancel() を呼び出すだけです。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()

3. Example: VibrationEffectを使用した振動発生(API 26以上、API 30以下)

VibrationEffect は、次のオブジェクト生成メソッドを提供します。

  • VibrationEffect.createOneShot()
  • VibrationEffect.createWaveform()

完全なコードはGitHub - Vibrationで確認できます。

3.1振動発生(1回)

パターンのない振動を発生させるには、 VibrationEffect.createOneShot() で VibrationEffect を生成する必要があります。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val effect = VibrationEffect.createOneShot(
        200, VibrationEffect.DEFAULT_AMPLITUDE)
vibrator.vibrate(effect)

最初の要因は発生させる振動時間で、単位はミリ秒です。 2番目の要因は振動強度で、 1 ~ 255の値を渡す必要があります。デフォルトの振動強度を使用するには、 DEFAULT_AMPLITUDEを渡すだけです。

3.2パターン振動発生(1回)

パターンで振動を発生させるには、 Vibrator.createWaveform() で VibrationEffect を生成する必要があります。

createWaveform()の最初の引数としてパターンが渡され、2番目の引数はRepeatで、-1は繰り返さない、0以上は繰返しを意味します。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val effect = VibrationEffect.createWaveform(timing, -1)
vibrator.vibrate(effect)

パターン配列の偶数インデックスは待ち時間、奇数インデックスは振動が発生する時間です。

Index 0: 100  // wait for 100ms
Index 1: 200  // vibrate for 200ms
Index 2: 100  // wait for 100ms
Index 3: 200  // vibrate for 200ms
Index 4: 100  // wait for 100ms
Index 5: 200  // vibrate for 200ms

3.3パターン(振動強度調整)振動発生(1回)

伝達されるパターンの振動強度を調整することもできます。

次のように、振動パターンと同じ長さの振動強度配列を係数に渡します。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amplitudes, -1)
vibrator.vibrate(effect)

振動パターンと振動強度配列の長さはすべて同じでなければなりません。パターンの0番Indexは振動強度の0番Indexに対応します。

つまり、次のように動作します。

Index 0: 100  // wait for 100ms, Amplitude: 0
Index 1: 200  // vibrate for 200ms, Amplitude: 50
Index 2: 100  // wait for 100ms, Amplitude: 0
Index 3: 200  // vibrate for 200ms, Amplitude: 50
Index 4: 100  // wait for 100ms, Amplitude: 0
Index 5: 200  // vibrate for 200ms, Amplitude: 50

3.4 振動の繰り返し

createWaveform() の最後の引数で振動を繰り返すかどうかを決定します。 -1は繰り返さない、0以上はパターンのIndexから配列の最後まで繰り返すことを意味します。

つまり、下のコードでrepeat引数を0に渡すと、パターン振動が一度発生し、0番目のIndexから最後まで無限に繰り返されます。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 ...)

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amp = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amp, 0)
vibrator.vibrate(effect)

もしrepeat因子で4を渡すと、パターン振動を一度発生させ、Index 4から5までを無限に繰り返します。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 4 -> 5 -> 4 -> 5 -> 4 ...)

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amp = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amp, 4)
vibrator.vibrate(effect)

3.5 振動キャンセル

繰り返しを止めたり振動をキャンセルしたりするには、次のように cancel() を呼び出すだけです。

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()

4. Example: Android 12のVibrationManagerを使用した振動発生(API 31以上)

Android 12でVibratorManagerが追加され、次のようにVibratorManagerをインポートできます。

private val vibratorManager: VibratorManager by lazy {
    getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
}

完全なコードはGitHub - VibratorManagerInAndroid12で確認できます。

4.1振動発生(1回)

次のコードを実行すると、500msの振動が1回発生します。

val vibrationEffect = VibrationEffect.createOneShot(
    500L,
    VibrationEffect.DEFAULT_AMPLITUDE
)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)

最初の要因は発生させる振動時間で、単位はミリ秒です。 2番目の要因は振動強度で、1〜255の値を渡す必要があります。デフォルトの振動強度を使用するには、DEFAULT_AMPLITUDEを渡すだけです。

4.2パターン振動発生(1回)

以下のコードは、設定したパターンで1回の振動を発生させます。

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, -1)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)

createWaveform()の最初の引数としてパターンが渡され、2番目の引数はrepeatで、-1は繰り返さない、0以上は繰り返しを意味します。

パターン配列の偶数インデックスは待ち時間、奇数インデックスは振動が発生する時間です。

Index 0: 100  // wait for 100ms
Index 1: 200  // vibrate for 200ms
Index 2: 100  // wait for 100ms
Index 3: 200  // vibrate for 200ms
Index 4: 100  // wait for 100ms
Index 5: 200  // vibrate for 200ms

4.3パターン(振動強度調整)振動発生(1回)

伝達されるパターンの振動強度を調整することもできます。 次のように、振動パターンと同じ長さの振動強度配列を係数に渡します。引数 repeat = -1 は繰り返さないことを意味します。

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, -1)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)

振動パターンと振動強度配列の長さはすべて同じでなければなりません。パターンの0番Indexは振動強度の0番Indexに対応します。

つまり、次のように動作します。

Index 0: 100  // wait for 100ms, Amplitude: 0
Index 1: 200  // vibrate for 200ms, Amplitude: 50
Index 2: 100  // wait for 100ms, Amplitude: 0
Index 3: 200  // vibrate for 200ms, Amplitude: 50
Index 4: 100  // wait for 100ms, Amplitude: 0
Index 5: 200  // vibrate for 200ms, Amplitude: 50

4.4 振動の繰り返し

repeat 引数をゼロ以上に渡すと振動が繰り返されます。

たとえば、次のコードでrepeat引数を0に渡すと、パターン振動が一度発生し、0番目のインデックスから最後まで無限に繰り返されます。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 ...)

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, 0)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)

もしrepeat因子で4を渡すと、パターン振動を一度発生させ、Index 4から5までを無限に繰り返します。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 4 -> 5 -> 4 -> 5 -> 4 ...)

val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, 4)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)

4.5 振動のキャンセル

cancel() を呼び出すことで、動作中の振動をキャンセルできます。

vibratorManager.cancel()

Related Posts

codechachaCopyright ©2019 codechacha