所有與觸覺回饋相關的 Android 架構改良項目,都是根據一組與時俱進的使用者體驗原則而開發。目前的原則包括以清晰的觸覺回饋取代震動,以及探索豐富的觸覺回饋。
圖 1. 目前的原則。
下表列出所有可用的觸覺回饋 API:
API | 方法和常數 | 新增年份 |
---|---|---|
android.view.HapticFeedbackConstants |
|
2016 年前 |
|
2017 年 (Android 8) | |
|
2020 年 (Android 11) | |
android.View |
|
2016 年前 |
android.os.Vibrator |
|
2016 年前 |
|
2017 年 (Android 8) | |
|
2020 年 (Android 11) | |
android.os.VibrationEffect |
|
2017 年 (Android 8) |
|
2019 年 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 年 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 年 (Android 10) |
震動幅度較強
早在呼叫器和功能型手機時代,低品質但省電的偏心旋轉質量 (ERM)蜂鳴器震動就已用來取代靜音模式下的鈴聲。如果舊版硬體元件會發出惱人的巨大聲響,可能會產生低品質的觸覺回饋,進而損害觸覺體驗 (例如便宜或損壞的手機)。
清除觸覺回饋
清晰觸覺回饋支援離散狀態變更的感覺 (例如開機和關機程序期間的二進位變更)。由於「離散」功能指標的性質,系統會將清晰的觸覺回饋生成為單一實體 (例如每個輸入事件一個觸覺效果)。
Android 的目標是提供清晰的觸覺回饋,以強烈但銳利的感覺為主,而非震動或模糊的感覺。
為支援清晰觸覺回饋而建立的預先定義觸覺常數包括下列元素。
CLOCK_TICK
CONFIRM
CONTEXT_CLICK
GESTURE_END
GESTURE_START
KEYBOARD_PRESS
KEYBOARD_RELEASE
KEYBOARD_TAP
LONG_PRESS
REJECT
TEXT_HANDLE_MOVE
VIRTUAL_KEY
VIRTUAL_KEY_RELEASE
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
裝置製造商和開發人員建立共同知識,是提升 Android 生態系統中觸覺回饋整體品質的關鍵。請參閱基本檢查清單、硬體評估和 CDD,進一步瞭解觸覺回饋實作方式。
圖 2. 按壓後放開。
豐富的觸覺回饋
豐富觸覺回饋是觸覺回饋技術的新興類別,可提供單一脈衝式效果以外的觸覺回饋。Android 的目標是支援豐富的觸覺回饋,並提供高度可組合性和可調整性,以及精細的精細度。Android 11 以下版本支援下列用途。
圖 3. 滑動紋理時提供豐富的觸覺回饋。
圖 4. 拖曳和滑動。
用途 1:滑動紋理
如果手指在觸控表面上滑動時重複觸覺效果 (例如拖曳、滑動、探索具有虛擬觸覺紋理的表面),重複的觸覺效果最好是清晰且細微。
如果個別效果是嗡嗡聲而非清脆聲,則重複間隔可能會消失。結果會發出一次長長的震動,而不是多個不連續的訊號。
如果震幅不夠細微,重複的觸覺能量就會累積,導致最後的震動過於強烈。
為滑動和拖曳手勢導入表面觸覺紋理
在 HapticFeedbackConstants
中使用 CLOCK_TICK
和 TEXT_HANDLE_MOVE
。
這些常數會預先定義重複次數和振幅的特性。
建立自己的特效
如要製作自己的效果,請在 VibrationEffect.Composition
中,將 PRIMITIVE_CLICK
和 PRIMITIVE_TICK
序列串連在一起,組成設計。
你可以使用 addPrimitive(int primitiveID, float scale, int delay)
調整重複次數和振幅比例的特徵。支援功能取決於 Vibrator HAL 介面的 CAP_COMPOSE_EFFECTS
功能。
用途 2:震動時間較長,且震動強度會逐漸增強
長震動是指從 0 轉換為目標振幅的平滑振幅震動。長震動可產生可察覺的注意力觸覺回饋。不過,在安靜的環境中,突然的長時間震動可能會嚇到使用者,而且通常會發出嗡嗡聲。如要產生更令人愉悅的長震動,請在長震動的開頭套用緩和效果。這會產生平滑的振幅轉換,並朝目標振幅建構。
套用「緩入」效果
使用
android.os.Vibrator.hasAmplitudeControl()
檢查振幅控制的硬體功能。- 結果必須為
true
,才能產生振幅不同的緩和進入效果。
- 結果必須為
請使用
VibrationEffect
。createWaveform(timings[], amplitudes[], int repeat)
。調整
timings[]
和amplitudes[]
系列,生成緩和進入曲線,如圖 5 所示。
圖 5. 震動幅度緩慢增加的曲線。
使用案例 3:音訊耦合觸覺回饋
音訊耦合觸覺是與音訊節奏耦合的觸覺模式,可吸引使用者注意。
音訊耦合觸覺回饋:優點
如要實作音訊耦合觸覺回饋,請將清晰的觸覺回饋與長震動結合。 清晰觸覺回饋功能會提供強烈但短暫的觸覺感受,傳達離散的節奏模式。搭配長震動提供的強烈刺激,可有效吸引使用者注意。
請務必考量感覺節奏模式。如果沒有節奏感,使用者會將觸覺感受視為隨機震動,並傾向於忽略。
圖 6. 音訊耦合觸覺回饋範例。
音訊耦合觸覺回饋:導入提示
如要實作音訊耦合觸覺回饋,必須對音訊和觸覺通道的內容播放有基本瞭解。請注意以下幾點:
使用
MediaPlayer
或SoundPool
類別。- OGG 格式的資產具有特殊中繼資料鍵 (
ANDROID_HAPTIC
後接觸覺通道數),表示有觸覺資料,並可透過MediaPlayer
和SoundPool
播放。
- OGG 格式的資產具有特殊中繼資料鍵 (
在
audio_policy_configuration.xml
中指出觸覺回饋和音訊播放的支援情形。- 使用具有觸覺回饋通道的輸出設定檔
AUDIO_CHANNEL_OUT_HAPTIC_A|B
。 - 如果是具有觸覺通道的輸出串流,請注意,觸覺通道會以額外通道的形式出現在資料中。
示例
如果輸出串流的聲道遮罩如下所示:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
這樣每個樣本看起來都會像這樣:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- 使用具有觸覺回饋通道的輸出設定檔
將
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
變更為false
,即可播放觸覺回饋通道。- 根據預設,觸覺回饋通道會設為靜音 (
true
)。 - 用途包括鈴聲和 UI 音效,並提供同步觸覺回饋。
- 根據預設,觸覺回饋通道會設為靜音 (
Vibrator HAL 必須實作外部控制支援功能。
- 如為 HIDL 實作,請使用
setExternalControl(bool enabled) generates (Status status)
。 - 如果是 AIDL 實作,請使用
void setExternalControl(in boolean enabled)
。
- 如為 HIDL 實作,請使用
圖 7. 實作音訊耦合觸覺回饋。
音訊耦合觸覺回饋:HapticGenerator
HapticGenerator
是 Android 12 推出的音效,可從音訊聲道產生觸覺回饋資料,並以音訊耦合觸覺回饋的形式即時播放。如圖 8 所示,效果會套用至 AudioTrack
:
圖 8. 觸覺效果產生器架構。
這張架構圖顯示 Haptic Generator 會在傳送至 Audio HAL 前,套用至傳入的使用者音訊串流。生成器會在 AudioMixer
分割音訊和觸覺回饋資料後套用,且會先於任何其他音訊效果套用,其輸出內容會覆寫串流中先前的任何觸覺回饋資料。
為確保觸覺產生器演算法能產生高品質的觸覺效果,請調整設定篩選器鏈結的參數,藉此調整裝置震動器馬達的產生演算法。本節將詳細說明這些參數,並說明如何根據硬體規格調整參數。
帶通濾波器的共振頻率
震動器共振頻率是指觸覺致動器達到最大輸出的頻率。這個參數會調整抗共振器,部分平坦化回應轉移函式,以取得更寬的頻寬。Android 架構會自動將這個值連結至 Vibrator HAL 方法
IVibrator.getResonantFrequency
的輸出內容。這個參數的預設值為 150 Hz。您可以在程式碼中修改這個值。
慢速信封的正規化能力
這個參數會決定部分正規化 (自動增益控制) 的指數。預設值為 -0.8,表示這個增益控制步驟會移除 80% 的動態範圍變化。你可以在程式碼中修改這項設定。
帶阻濾波器的 Q 因子
振動器品質因數 (Q 因數) 取決於兩個參數:
零 Q,帶阻濾波器中零的品質因數,可部分抵銷共振
極點 Q,帶阻濾波器中極點的品質因數
這兩個值的比率會限制共振的抑制作用,以提升較低的頻率並擴大演算法回應。舉例來說,Zero Q 的預設值為 8,Pole Q 的預設值為 4,兩者比率為 2,因此共振抑制會限制為 2 倍 (6 dB)。Android 架構會將這兩個值連結至 Vibrator HAL 方法
IVibrator.getQFactor
的輸出內容。如果預設值未將裝置的馬達強度衰減納入考量,建議同時修改這兩個值,並同時增加或減少。零 Q 與極 Q 的比率應大於 1。你可以在程式碼中修改這項設定。
失真轉角頻率
低通濾波器會套用轉角頻率,抑制低階震動,並使用立方失真來強化高階震動。預設值為 300 Hz。你可以在程式碼中修改這個值。
輸入增益和失真立方體閾值
這些參數會套用至輸入波形的非線性失真濾波器,用來降低低頻信號的振幅,並提高高頻信號的振幅。
- 輸入增益因子的預設值為 0.3。
- 立方體門檻的預設值為 0.1。
建議您一併修改這兩個值。您可以在程式碼中找到這些項目。
如要進一步瞭解這個篩選器套用的函式,請參閱程式碼中的實作方式。
如要進一步瞭解這兩個參數如何影響輸出內容,建議您繪製濾鏡的頻率響應,並觀察頻率響應如何隨著不同的參數值而變化。
失真輸出增益
這個參數可控制最終震動幅度。這是套用在軟限制器後的最終增益,可將震動幅度限制在 1 以下。預設值為 1.5,您可以在程式碼中修改這個值。
如果震動幅度太小,請調高值。如果聽到致動器硬體發出喀喀聲,請降低值。