イベントに触覚フィードバックを追加する

ハプティクスの最も基本的なユースケースの一つは、ユーザー操作へのフィードバックの提供です。時間選択ツール、仮想キーボードのキー押下、テキスト選択は、触覚フィードバックの優れたユースケースの一般的な例です。ハプティクスを適用するタイミングと方法について詳しくは、ハプティクスの設計原則をご覧ください。

このページでは、触覚フィードバックを提供する 3 つの方法について説明します。

これらのメソッドは、デバイスレベルで定義されたプリミティブを使用して、使用するデバイスに合わせた高品質のフィードバックを提供します。

デフォルトでは、すべての触覚フィードバック メソッドに、ユーザーのタッチ フィードバック設定が適用されます。

View コンポーネントを使用して触覚フィードバックを生成する

View.performHapticFeedback メソッドを使用して触覚フィードバックを生成します。HapticFeedbackConstants によって定義される触覚定数は、実行される触覚効果の種類ではなく、アプリの機能に焦点を当てています。

基盤となる実装はデバイスとハードウェアの機能によって異なる場合がありますが、アプリで考慮する必要があるのは、特定のコンテキストで提供するフィードバックの種類のみです。機能に焦点を当てることで、類似の操作に対する触覚フィードバックを有効にできます。ユーザーは時間の経過とともに異なる触覚に異なる意味を関連付けることを学習します。

前提条件: 触覚フィードバックを有効にする

View が表示されている限り、そのイベントに触覚フィードバックを使用できます。長押しなどの一部のイベントには、ビューのリスナーがイベントを処理する(true を返す)場合にトリガーされるデフォルトのハプティクスがあります。

Android の View は、View.hapticFeedbackEnabled プロパティを false に設定することで触覚フィードバックを無効にできます。このプロパティを無効にすると、デフォルトのフィードバックが生成されます。

また、performHapticFeedback メソッドはシステム設定 HAPTIC_FEEDBACK_ENABLED を遵守します。これにより、ユーザーはシステム全体でこの設定を無効にできます。

他の触覚 API とは異なり、ViewHapticFeedbackConstants を使用する場合、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.areEffectsSupportedVibrator.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 を使用して準備し、Vibratorvibrate メソッドのいずれかを使用して再生できます。

この例では、クリック効果を再生します。

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 の使用方法については、カスタム触覚効果の作成をご覧ください。