觸覺框架的用戶體驗基金會

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

用戶體驗原則

圖 1.當前原則

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

API方法添加年份
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • 長按
2016 年之前
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (安卓 8)
  • 確認
  • 拒絕
  • GESTURE_START
  • GESTURE_END
2020(安卓 11)
android.View
  • 執行觸覺反饋()
2016 年之前
android.os.Vibrator
  • 顫動()
  • 有振動器()
2016 年之前
  • 有振幅控制()
2017 (安卓 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020(安卓 11)
android.os.VibrationEffect
  • createOneShot()
  • 創建波形()
2017 (安卓 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • 創建預定義()
2019(安卓 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • 撰寫()
2020(安卓 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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類。

    • 帶有特殊元數據鍵( 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 中所述。

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 ,可以在此處的代碼中進行修改。如果振動太微妙,請增加該值。如果您能聽到執行器硬件發出嘎嘎聲,請減小該值。