ハプティクスの最も基本的なユースケースの一つは、ユーザー操作へのフィードバックの提供です。時間選択ツール、仮想キーボードのキー押下、テキスト選択は、触覚フィードバックの優れたユースケースの一般的な例です。ハプティクスを適用するタイミングと方法について詳しくは、ハプティクスの設計原則をご覧ください。
このページでは、触覚フィードバックを提供する 3 つの方法について説明します。
View
を使用します(推奨)。このアプローチはアクション指向であり、最も幅広くサポートされており、VIBRATE
権限は必要ありません。- 事前定義された
VibrationEffect
を使用します。このアプローチは柔軟性に優れていますが、トレードオフもあります。 - プリミティブで高度なコンポジションを使用する。この方法は新しく、より柔軟性に優れていますが、特定のデバイスのサポートが必要です。
これらのメソッドは、デバイスレベルで定義されたプリミティブを使用して、使用するデバイスに合わせた高品質のフィードバックを提供します。
デフォルトでは、すべての触覚フィードバック メソッドに、ユーザーのタッチ フィードバック設定が適用されます。
View
コンポーネントを使用して触覚フィードバックを生成する
View.performHapticFeedback
メソッドを使用して触覚フィードバックを生成します。HapticFeedbackConstants
によって定義される触覚定数は、実行される触覚効果の種類ではなく、アプリの機能に焦点を当てています。
基盤となる実装はデバイスとハードウェアの機能によって異なる場合がありますが、アプリで考慮する必要があるのは、特定のコンテキストで提供するフィードバックの種類のみです。機能に焦点を当てることで、類似の操作に対する触覚フィードバックを有効にできます。ユーザーは時間の経過とともに異なる触覚に異なる意味を関連付けることを学習します。
前提条件: 触覚フィードバックを有効にする
View
が表示されている限り、そのイベントに触覚フィードバックを使用できます。長押しなどの一部のイベントには、ビューのリスナーがイベントを処理する(true
を返す)場合にトリガーされるデフォルトのハプティクスがあります。
Android の View
は、View.hapticFeedbackEnabled
プロパティを false
に設定することで触覚フィードバックを無効にできます。このプロパティを無効にすると、デフォルトのフィードバックが生成されます。
また、performHapticFeedback
メソッドはシステム設定 HAPTIC_FEEDBACK_ENABLED
を遵守します。これにより、ユーザーはシステム全体でこの設定を無効にできます。
他の触覚 API とは異なり、View
で HapticFeedbackConstants
を使用する場合、VIBRATE
権限は必要ありません。
HapticFeedbackConstant
を選択
View
コンポーネントを HapticFeedbackConstants
とともに使用する場合、これらの定数は必要に応じてフォールバック動作を持つため、特定のデバイス サポートを評価する必要はありません。唯一の考慮事項は、目的の定数の SDK レベルです。
例 1: キー操作
タッチリスナーを使用して、View
のタップ入力に触覚フィードバックを追加する方法の例を以下に示します。このエフェクトは、ボタンを押してから離すような感覚をシミュレートします。
Kotlin
class HapticTouchListener : View.OnTouchListener { override fun onTouch(View view, MotionEvent event) : Boolean { when (event.actionMasked) { MotionEvent.ACTION_DOWN -> view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY) MotionEvent.ACTION_UP -> view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE) } return true } }
Java
class HapticTouchListener implements View.OnTouchListener { @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); break; case MotionEvent.ACTION_UP: view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE); break; } return true; } }
例 2: 送信ボタン
触覚フィードバックのユースケースは、デバイスの物理的な操作をシミュレートするだけではありません。抽象的な意味を伝えるために使われることもあります。たとえば、CONFIRM
効果の一般的な期待値は短くて軽いバイブレーションですが、REJECT
は信号の失敗に対するより強いフィードバックである可能性があります。次の例は、送信ボタンのフィードバックを示しています。
Kotlin
submitButton.setOnClickListener { view -> val successful = performSubmit() if (successful) { view.performHapticFeedback(HapticFeedbackConstants.CONFIRM) } else { view.performHapticFeedback(HapticFeedbackConstants.REJECT) } }
Java
submitButton.setOnClickListener(view -> { boolean successful = performSubmit(); if (successful) { view.performHapticFeedback(HapticFeedbackConstants.CONFIRM); } else { view.performHapticFeedback(HapticFeedbackConstants.REJECT); } });
事前定義された VibrationEffect
を使用して触覚フィードバックを生成する
View
ベースのアプローチを使用すると、ユーザーの操作に重点が置かれます。システム全体で一貫性を保つため、この方法をおすすめします。ただし、事前定義された特定の VibrationEffect
API を呼び出して、触覚フィードバック効果をカスタマイズすることもできます。
事前定義済みのエフェクトは、VibrationEffect
定数として利用できます。サポートがあるかどうかを確認し、次の例に示すように Vibrator
サービスで再生することができます。
VibrationEffect
API のデバイス サポートについて
基本的な使用では、個々の VibrationEffect
API のサポートを確認する必要はありません。Vibrator.areEffectsSupported
や Vibrator.areAllEffectsSupported
などの API は、デバイスで定数がカスタマイズされているかどうかを判別するために使用されます。カスタマイズされたエフェクトが存在しない場合でも、アプリはエフェクトを再生し、プラットフォームで定義されたフォールバック実装を使用できます。
詳細については、事前定義の VibrationEffect
をご覧ください。
前提条件: バイブレーターと VIBRATE
権限を読み込む
ほとんどのバイブレーションは Vibrator
サービスで再生できます。このサービスは次のように読み込むことができます。
Kotlin
import android.os.Vibrator val vibrator = context.getSystemService(Vibrator::class.java)
Java
import android.os.Vibrator; Vibrator vibrator = context.getSystemService(Vibrator.class);
このサービスを使ってデバイスを振動させるには、アプリに VIBRATE
権限が必要です。この権限は、次のようにアプリ マニフェスト ファイルに追加できます。
<uses-permission android:name="android.permission.VIBRATE"/>
事前定義された VibrationEffect
を再生する
事前定義済みのエフェクトは、VibrationEffect.createPredefined
を使用して準備し、Vibrator
で vibrate
メソッドのいずれかを使用して再生できます。
この例では、クリック効果を再生します。
Kotlin
val vibrator = context.getSystemService(Vibrator::class.java) ... // Requires VIBRATE permission vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
Java
Vibrator vibrator = context.getSystemService(Vibrator.class); ... // Requires VIBRATE permission vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
プリミティブで高度なコンポジションを使用する
VibrationEffect.Composition
API は、触覚フィードバックの新たな可能性を提供します。ただし、エフェクトとは異なり、これらのプリミティブにはシステムレベルのフォールバックがありません。つまり、デバイスでサポートされるプリミティブとその他の機能には細心の注意を払う必要があります。
これらの API の使用方法については、カスタム触覚効果の作成をご覧ください。