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

所有以觸覺技術為基礎的 Android 架構改善項目,都是由一組以相同速度演進的 UX 原則驅動。現行原則包括將「震動震動」替換為「清晰觸覺回饋」,並探索「豐富觸覺回饋」

使用者體驗原則

圖 1. 現行原則

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

API 方法 新增年份
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • 長篇_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
  • 震動
  • hasVibrator()
2016 年之前
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • 點擊
  • 有效 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,您可以在這裡的程式碼中修改。如果振動幅度太小,請調高數值。如果您聽到致動器硬體發出嘎嘎聲,請降低該值。