在 Android 應用程式中實作觸覺回饋,方法是使用 View 元件、預先定義的 VibrationEffect API,以及以 VibrationEffect.Builder 為錨點的時間軸組合。keywords_public: > Android 開發、觸覺技術、觸覺回饋、UI、檢視區塊、VibrationEffect、View.performHapticFeedback、Vibrator、觸覺常數
觸覺技術最基本的用途之一,就是為使用者互動提供回饋。時間挑選器、虛擬鍵盤上的按鍵按下動作和文字選取是觸覺回饋的常見用途。如要進一步瞭解何時及如何套用觸覺效果,請參閱「觸覺技術設計原則」。
本頁說明提供觸覺回饋的三種方式。
- 使用
View(建議做法)。這種做法以動作為導向,支援範圍最廣,且不需要VIBRATE權限。 - 使用預先定義的
VibrationEffect。 這種做法較有彈性,但會有一些取捨。 - 使用以時間軸為錨點的組合,並搭配
VibrationEffect.Builder。 這種做法最為彈性,可讓您沿著時間軸排序預設值、封包和其他震動元素,並內建自動備援支援功能。
這些方法會使用裝置層級定義的基元,提供根據手邊裝置量身打造的高品質意見回饋。
根據預設,所有觸覺回饋方法都會遵守使用者的觸控回饋設定。
使用 View 元件產生觸覺回饋
使用 View.performHapticFeedback 方法產生觸覺回饋。HapticFeedbackConstants 定義的觸覺常數著重於應用程式中的功能,而非執行的觸覺效果類型。
實際的實作方式可能因裝置和硬體功能而異,但應用程式只需要考量在特定情境中提供的意見回饋類型。著重於功能,即可為類似互動啟用觸覺回饋。使用者會隨著時間,將不同觸覺感受與不同意義建立關聯。
必要條件:啟用觸覺回饋
只要 View 可見,即可對其事件使用觸覺回饋。
部分事件 (例如按住) 具有預設觸覺回饋,如果檢視畫面上的監聽器處理事件 (傳回 true),就會觸發這類回饋。
Android View 可以將 View.hapticFeedbackEnabled 屬性設為 false,停用觸覺回饋。停用這項屬性會導致系統提供預設意見回饋。
performHapticFeedback 方法也會遵守系統設定 HAPTIC_FEEDBACK_ENABLED,讓使用者可能為整個系統停用這些設定。
與其他觸覺 API 不同,使用 HapticFeedbackConstants 和 View 不需要 VIBRATE 權限。
選擇HapticFeedbackConstant
搭配 HapticFeedbackConstants 使用 View 元件時,不需要評估特定裝置支援,因為這些常數會在必要時提供備援行為。唯一考量是所需常數的 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」。
先決條件:載入 Vibrator 和 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.Builder 建立組合
從 Android 16 (26Q4) 開始,VibrationEffect.Builder API 提供最彈性且具表現力的方式,可沿著時間軸排序離散預設值、封包和其他震動元素,建立自訂觸覺回饋。此外,使用 VibrationEffect.Builder 建立的組合,在支援的元素中內建自動備援支援功能。
如要進一步瞭解如何使用 VibrationEffect.Builder (和 VibrationEffect.Composition API) 撰寫觸覺效果,請參閱「建立自訂觸覺效果」。