觸覺框架的使用者體驗基礎

所有圍繞觸覺構建的 Android 框架改進都是由一組以相同速度發展的 UX 原則驅動的。目前的原則包括用清晰的觸覺取代嗡嗡的振動,並探索豐富的觸覺

使用者體驗原則

圖 1.當前原則

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

應用程式介面方法新增年份
android.view.HapticFeedbackConstants
  • 上下文_點擊
  • 時鐘滴答聲
  • 虛擬鍵
  • 鍵盤_TAP
  • 長按
2016年以前
  • KEYBOARD_PRESS
  • 鍵盤釋放
  • TEXT_HANDLE_MOVE
  • 虛擬鍵釋放
2017 年(安卓 8)
  • 確認
  • 拒絕
  • GESTURE_START
  • 手勢_END
2020 年(安卓 11)
android.View
  • 執行觸覺回饋()
2016年以前
android.os.Vibrator
  • 顫動()
  • 有振動器()
2016年以前
  • 有振幅控制()
2017 年(安卓 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 年(安卓 11)
android.os.VibrationEffect
  • 建立OneShot()
  • 建立波形()
2017 年(安卓 8)
  • 效果_勾選
  • 點擊效果
  • 效果_重_點擊
  • 按兩下效果
  • 建立預定義()
2019 年(安卓 10)
android.os.VibrationEffect.Composition
  • 原語_勾選
  • 原語_點擊
  • 加入原語()
  • 撰寫()
2020 年(安卓 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMulated()
2019 年(安卓 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 過渡到目標振幅的平滑振幅振動。長時間的振動可以產生容易感知的注意力觸覺。然而,突然的長時間振動可能會在安靜的環境中嚇到用戶,並且經常會產生可聽見的嗡嗡聲。要產生更令人愉悅的長振動,請在長振動開始時施加緩入效果。這會產生平滑的幅度過渡,逐漸達到目標幅度。

應用緩入效果

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

    • 結果必須true才能產生不同幅度的緩入效果。
  2. 使用VibrationEffectcreateWaveform(timings[], amplitudes[], int repeat)

  3. 調整一連串的timings[]amplitudes[]以產生緩入曲線,如圖6所示。

長時間震動

圖 6.長振動緩和曲線

用例 3:音訊耦合觸覺

音訊耦合觸覺是與音訊節奏相結合的觸覺模式,以吸引使用者的注意。

音訊耦合觸覺:優點

要實現音頻耦合觸覺,請將清晰的觸覺與長振動相結合。清晰的觸覺帶來強烈但短暫的觸覺,提供離散的節奏模式。當與長振動提供的高水平刺激相結合時,這可以很好地吸引用戶的注意力。

考慮感覺節奏模式很重要。如果沒有節奏感,使用者會將觸覺感知為隨機的嗡嗡聲,並傾向於忽略它們。

音訊耦合

圖 7.音頻耦合觸覺範例

音訊耦合觸覺:實施技巧

實現音訊耦合觸覺需要對音訊和觸覺通道的內容播放有基本的了解。請記住以下幾點。

  • 使用MediaPlayerSoundPool類別。

    • OGG 格式的資產具有特殊的元資料鍵( ANDROID_HAPTIC後接多個觸覺通道)指示觸覺資料的存在以及使用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 所示。

Haptic Generator architecture

圖 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的輸出。

    如果預設值沒有考慮設備中馬達強度的衰減,我們建議同時修改這兩個值,並增加或減少這兩個值。零 Q 與極 Q 的比率應大於1 。可以在此處的程式碼中對此進行修改。

  4. 失真角頻率

    轉角頻率由低通濾波器應用,該濾波器可抑制低級振動並使用立​​方失真來增強更高級別的振動。預設為300Hz 。可以在此處的程式碼中對此進行修改。

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

    這些參數由應用於輸入波形的非線性失真濾波器使用,該濾波器抑制低頻訊號的振幅並增加高頻訊號的振幅。

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

    我們建議同時修改這兩個值。它們可以在此處的程式碼中找到。

    有關此過濾器應用的功能的更多信息,請參閱此處提供的實現。要詳細了解這兩個參數如何影響輸出,我們建議繪製濾波器的頻率響應並觀察頻率響應如何隨不同參數值變化。

  6. 失真輸出增益

    此參數控制最終的振動幅度。它是在軟限制器之後應用的最終增益,將振動幅度限制為小於 1。其預設值為1.5 ,可以在此處的程式碼中修改。如果振動太細微,請增加該值。如果您聽到執行器硬體發出嘎嘎聲,請減少該值。