觸覺技術架構的使用者體驗基礎

所有以觸覺技術為基礎的 Android 架構改善項目,都是以一套以相同速度演進的 UX 原則為依據。目前的原則包括以清晰的觸覺回饋取代嗡嗡作響的震動,以及探索豐富的觸覺回饋

使用者體驗原則

圖 1. 現行原則

下表列出所有可用的觸覺回饋 API。

API 方法 新增年份
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
2016 年之前
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • 確認
  • 拒絕
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
2016 年之前
android.os.Vibrator
  • vibrate()
  • hasVibrator()
2016 年之前
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 年 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 年 (Android 10)

嗡嗡作響的震動

自尋呼機和功能型手機以來,低品質但省電的 ERM 鈴聲震動一直是靜音模式中鈴聲的替代方案。舊版硬體元件會產生嘈雜且令人不悅的聲響,導致觸覺回饋使用者體驗品質不佳 (例如廉價的故障手機)。

清晰的觸覺回饋

清晰觸覺回饋可支援獨立狀態變更的感覺 (例如開/關機程序中的二進位變更)。由於獨立操作元素的特性,系統會以單一實體產生清晰的觸覺回饋 (例如每個輸入事件一個觸覺效果)。

Android 旨在提供清晰的觸覺回饋,帶來強烈但清晰的感受,而非嗡嗡作響或模糊的感受。

為了支援清晰的觸覺回饋,我們建立了以下預先定義的觸覺常數。

HapticFeedbackConstants 中:

  • 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

VibrationEffect 中:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

在裝置製造商和開發人員之間建立共同知識,是提高 Android 生態系統觸覺回饋整體品質的關鍵。請參考基本檢查清單硬體評估CDD,進一步瞭解觸覺回饋實作方式。

按下並放開

圖 3. 按下及放開。

多樣化的觸覺回饋

豐富的觸覺回饋是觸覺回饋的一種,它不只提供單一脈衝效果。Android 旨在支援具備高組合性和可調整性的豐富觸覺回饋,並提供精細的細微調整。Android 11 以下版本支援下列用途。

觸覺回饋

圖 4. 滑動觸感的豐富觸覺回饋

拖曳和滑動

圖 5. 拖曳和滑動

用途 1:滑動紋理

如果在手指滑過觸控表面時重複觸覺效果 (例如拖曳、滑動、透過幻象觸覺紋理探索表面),建議重複的觸覺效果應清晰而細微。

如果個別效果是嗡嗡聲,而非清晰聲,則重複播放的間隔可能會消失。結果是發出一個長音,而不是多個獨立的信號。

如果振幅不夠細微,則在重複過程中,感知到的觸覺能量會逐漸累積,導致重複結束時產生過於強烈的觸覺效果。

實作簡單的表面觸覺紋理,用於滑動和拖曳手勢

HapticFeedbackConstants 中使用 CLOCK_TICKTEXT_HANDLE_MOVE。這些常數會預先定義重複和振幅的特性。

建立自己的特效

如要自行製作特效,請在 VibrationEffect.Composition 中串連 PRIMITIVE_CLICKPRIMITIVE_TICK 序列,藉此組合設計。您可以使用 addPrimitive(int primitiveID, float scale, int delay) 調整重複和振幅比例的特性。支援功能取決於 Vibrator HAL 介面CAP_COMPOSE_EFFECTS 功能。

用途 2:長時間震動,並加上漸進效果

長振動是從 0 到目標振幅的平滑振動轉換。長時間震動可產生容易察覺的注意力觸覺回饋。不過,突然出現的長時間震動會讓使用者在安靜的環境中受到驚嚇,而且通常會發出嗡嗡聲。如要產生更悅耳的長時間震動效果,請在長時間震動開始時套用漸強效果。這會產生平滑的振幅轉換,並朝目標振幅建立。

套用 ease-in 效果

  1. 使用 android.os.Vibrator.hasAmplitudeControl() 檢查振幅控制功能的硬體功能。

    • 結果必須是 true,才能產生以不同振幅的漸進效果。
  2. 請使用 VibrationEffectcreateWaveform(timings[], amplitudes[], int repeat)

  3. 調整 timings[]amplitudes[] 的序列,產生漸增曲線,如圖 6 所示。

長震動

圖 6. 長震動緩升曲線

用途 3:音訊耦合觸覺回饋

音訊耦合觸覺回饋是指與音訊節奏搭配的觸覺回饋模式,用於吸引使用者注意。

音訊耦合觸覺回饋:優點

如要實作音效連動觸覺回饋,請結合清晰的觸覺回饋和長時間的震動。清晰觸覺回饋提供強烈但短暫的觸覺感應,可提供獨立的節奏模式。搭配長時間震動提供的高刺激度,這項功能可有效吸引使用者的注意力。

請務必考量感覺節奏模式。如果沒有節奏感,使用者會將觸覺震動感知為隨機的嗡嗡聲,並傾向於忽略。

音訊配對

圖 7. 音訊觸覺效果範例

音訊耦合觸覺回饋:導入訣竅

如要實作音訊耦合觸覺回饋,您必須對音訊和觸覺回饋管道的內容播放有基本瞭解。請注意以下事項。

  • 使用 MediaPlayerSoundPool 類別。

    • 使用特殊中繼資料鍵 (ANDROID_HAPTIC 後面接著多個觸覺回饋管道) 的 OGG 格式資產,會指出是否有觸覺回饋資料,以及是否透過 MediaPlayerSoundPool 播放。
  • 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 必須實作外部控制支援功能。

音訊耦合觸覺

圖 8. 實作音訊耦合觸覺回饋

音訊連動觸覺回饋:觸覺產生器

HapticGenerator 是 Android 12 中推出的音訊效果,可從音訊管道產生觸覺資料,並以音訊耦合觸覺效果即時播放。效果會套用至 AudioTrack,如圖 9 所述。

觸覺效果產生器架構

圖 9.觸覺效果產生器架構

為確保觸覺模擬器演算法能產生高品質的觸覺回饋,請調整參數,以便設定套用至音訊波形的篩選器鏈結,進而調整產生演算法以符合裝置震動馬達。本節將詳細說明這些參數,並說明如何根據硬體規格進行調整。

  1. 頻帶濾波器的諧振頻率

    振動器諧振頻率是觸覺馬達執行器輸出功率達到最高的頻率。這個參數會調整抗諧振器,以便部分平坦化回應轉移函式,進而獲得更寬的頻寬。Android 架構會自動將這個值連結至 Vibrator HAL 方法 IVibrator.getResonantFrequency 的輸出內容。

    這個參數的預設值為 150Hz。您可以在此處的程式碼中修改此值。

  2. 慢速信封的正規化功率

    這個參數會決定部分規格化 (自動增益控制) 中的指數。其預設值為 -0.8,表示這項增益控制步驟會移除 80% 的動態範圍變化。您可以在這裡的程式碼中修改這項設定。

  3. 頻帶阻塞濾波器的 Q 因子

    振動器品質因子 (Q 因子) 取決於兩個參數:

    • 零 Q,即頻帶阻濾器中零的品質因數,可部分消除共振現象。

    • 極點 Q,即頻帶阻濾器中極點的品質係數。

    這兩個值的比率會限制共振抑制,以便提升較低的頻率並擴大演算法回應。舉例來說,零點 Q 的預設值為 8,極點 Q 的預設值為 4,兩者相除的結果為 2,表示共振抑制會以 2 (6 dB) 的因數限制。Android 架構會將這兩個值連結至 Vibrator HAL 方法 IVibrator.getQFactor 的輸出內容。

    如果預設值未考量裝置中馬達強度的減弱情形,建議同時修改這兩個值,並將兩者都調高或調低。Zero Q 與 Pole Q 的比率應大於 1。您可以在這裡的程式碼中修改這項設定。

  4. 失真角頻率

    角頻率是由低通濾波器套用,可抑制低振幅震動,並使用立方失真強化較高振幅。預設值為 300Hz。您可以在這裡的程式碼中修改這項設定。

  5. 輸入增益和失真立方體閾值

    這些參數會由非線性失真篩選器使用,該篩選器會套用至輸入波形,以減弱較低頻率信號的振幅,並提高較高頻率信號的振幅。

    • 輸入增益因子的預設值為 0.3
    • 立方體門檻的預設值為 0.1

    建議您一併修改這兩個值。您可以在這裡的程式碼中找到這些值。

    如要進一步瞭解這個篩選器套用的函式,請參閱這裡的實作方式。如要進一步瞭解這兩個參數對輸出內容的影響,建議您繪製濾波器的頻率回應,並觀察頻率回應如何隨著不同參數值而變化。

  6. 失真輸出增益

    這個參數可控制最終的震動幅度。這是在軟限制器後套用的最終增益,可將振動幅度限制在小於 1 的範圍內。其預設值為 1.5,可在這裡的程式碼中修改。如果震動太微弱,請提高該值。如果您聽到致動器硬體發出嘎嘎聲,請降低該值。