實現觸覺

設備製造商通常被認為是為每個設備創建的私有資產的所有者。因此,他們的工程工作通常集中在每個設備的基礎上;生態系統中其他設備的一致性幾乎沒有任何努力。

與之形成鮮明對比的是,開發人員努力構建適用於生態系統中所有Android 手機的應用程序,而不管每台設備的技術規格如何。這種方法上的差異可能會導致碎片化問題,例如,某些手機的硬件功能與應用程序開發人員設定的期望不符。因此,如果觸覺 API 在某些 Android 手機上有效,而在其他手機上無效,則結果是一個不一致的生態系統。這就是為什麼硬件配置在確保製造商可以在每台設備上實現 Android 觸覺 API 方面發揮關鍵作用的原因。

此頁面提供了設置硬件合規性以充分利用 Android 觸覺 API 的分步清單。

下圖說明了在設備製造商和開發人員之間建立共同知識,這是創建有凝聚力的生態系統的關鍵步驟。

應用程序開發人員和設備製造商的觸覺用例圖

圖 1.在設備製造商和開發人員之間建立知識

觸覺實施清單

  1. 實現常量

    • 實現觸覺的常量列表。
  2. HAL 和 API 之間的映射常量

    • 公共 API 常量(在框架中命名為佔位符)和實現佔位符的 HAL 常量之間的映射建議。
    • 請參閱設計原則以指導推薦的映射以了解有關此過程的更多信息。
  3. 評估硬件

    • 關於目標觸覺效果的說明。使用這些說明對您的硬件進行快速檢查。

我們將在下面更詳細地探討這些步驟中的每一個。

第 1 步:實現常量

執行這些檢查以確定您的設備是否滿足實現觸覺的最低要求。

觸覺實施過程流程圖

圖 2.實施效果

實現原語的步驟流程圖

圖 3.實現原語

檢查以下觸覺常量的實現狀態。

觸覺常數位置和摘要
EFFECT_TICKEFFECT_CLICKEFFECT_HEAVY_CLICKEFFECT_DOUBLE_CLICK VibrationEffect
VibrationEffect中的觸覺常量不包含任何輸入事件的概念,也沒有 UI 元素。常量包括能量級別的概念,例如EFFECT_CLICKEFFECT_HEAVY_CLICK ,它們由createPredefined()調用。
PRIMITIVE_TICK , PRIMITIVE_CLICK , PRIMITIVE_LOW_TICK> , PRIMITIVE_SLOW_RISE , PRIMITIVE_QUICK_RISE , PRIMITIVE_QUICK_FALL , PRIMITIVE_SPIN , PRIMITIVE_THUD VibrationEffect.Composition
VibrationEffect.Composition中的觸覺常數允許具有可伸縮的強度,由addPrimitive(int primitiveId, float scale, int delay)調用。

下面描述的替代振動將在未實現VibrationEffect常數的設備上執行。建議更新這些配置以在此類設備上發揮最佳性能。

  1. EFFECT_CLICK

    使用VibrationEffect.createWaveform創建的波形振動和在frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern中配置的時序。

  2. EFFECT_HEAVY_CLICK

    使用VibrationEffect.createWaveform創建的波形振動和在frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern中配置的時間。

  3. EFFECT_DOUBLE_CLICK

    使用VibrationEffect.createWaveform和時間 (0, 30, 100, 30) 創建的波形振動。

  4. EFFECT_TICK

    使用VibrationEffect.createWaveform創建的波形振動和在frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern中配置的時序。

測試觸覺反饋的步驟流程圖

圖 4.實現反饋常數

檢查以下公共反饋常量的狀態。

觸覺常數位置和摘要

CLOCK_TICK , CONTEXT_CLICK , KEYBOARD_PRESS , KEYBOARD_RELEASE , KEYBOARD_TAP , LONG_PRESS , TEXT_HANDLE_MOVE , VIRTUAL_KEY , VIRTUAL_KEY_RELEASE , CONFIRM , REJECT , GESTURE_START , GESTURE_END

HapticFeedbackConstants
HapticFeedbackConstants中的觸覺常量通過某些 UI 元素輔助輸入事件,例如KEYBOARD_PRESSKEYBOARD_RELEASE ,它們由performHapticFeedback()調用。

第 2 步:在 HAL 和 API 之間映射常量

第 2 步介紹了公共 HAL 常量和 API 常量之間的推薦映射。如果步驟 1 中評估的硬件未實現 HAL 常量,則應使用步驟 2 更新步驟 1 中描述的回退模式,以生成類似的輸出。映射由兩個不同的默認模型輔助。

  • 離散模型(簡單)

    • 幅度是該模型的關鍵變量。 HAL 中的每個實體代表不同的觸覺幅度。
    • 此模型是實現基本觸覺 UX 所需的最低要求。
    • 更高級的觸覺 UX 需要高級硬件和高級模型(連續模型)。
  • 連續模型(高級)

    • 紋理和振幅是該模型的關鍵變量。 HAL 中的每個實體代表不同的觸覺紋理。每個 HAL 實體的幅度由比例因子 ( S ) 控制。
    • 該模型需要先進的硬件。如果 OEM 想要將高級觸覺 UX 與VibrationEffect.Composition一起使用(以充分利用最新的觸覺 API),建議使用此模型實現其硬件。

離散模型

建議使用適當的 HAL 常量映射 API 中提供的所有公共常量。要開始此過程,請找出設備可以在 HAL 中定義多少具有離散幅度的觸覺波形。圍繞該概念構建的一個特定問題如下所示:在我的手機中可以定義多少具有人類可感知幅度差異的單脈衝觸覺效果?這個問題的答案決定了映射。

定義 HAL 常量是一個依賴於硬件的過程。例如,入門級手機可能只有硬件功能來產生單個觸覺波形。具有更高級硬件組件的設備產生更廣泛的離散幅度級別,並且可以在 HAL 中定義多個觸覺波形。 HAL-API 常數映射採用 HAL 常數(使用中等幅度作為基線),然後從那裡排列更強或更弱的效果。

HAL 恆定範圍和反饋幅度圖

圖 5. HAL 常數範圍(按幅度)

當定義了具有離散幅度的 HAL 常量的數量時,就可以通過 HAL 常量的數量來映射 HAL 和 API 常量了。此映射過程可以將單個脈衝 API 常數分割成最多三個離散的幅度級別組。 API 常量的分段方式基於伴隨輸入事件的 UX 原則。有關更多信息,請參閱觸覺 UX 設計

HAL-API 常量映射的離散模型

圖 6. HAL-API 常量映射:離散模型

如果您的設備僅支持兩個具有離散幅度的 HAL 常量,請考慮合併中等和高幅度級別的 HAL 常量。這種概念在實踐中的一個示例是將EFFECT_CLICKEFFECT_HEAVY_CLICK映射到相同的 HAL 常數,這將是中等幅度電平 HAL 常數。如果您的設備僅支持一個具有離散幅度的 HAL 常數,請考慮將所有三個級別合併為一個級別。

連續模型

具有幅度可伸縮性的連續模型可用於定義 HAL 常數。可以將比例因子 ( S ) 應用於 HAL 常量(例如, HAL_H0HAL_H1 )以生成縮放後的 HAL ( HAL_H0 x S )。在這種情況下,縮放的 HAL 被映射以定義 API 常量 ( HAL_H0 x S1 = H0S1 = EFFECT_TICK ),如圖 7 所示。通過使用連續模型的幅度可縮放性,設備可以存儲少量具有獨特紋理的 HAL 常量並通過調整比例因子 ( S ) 添加幅度變化。設備製造商可以根據他們想要提供多少不同的觸覺紋理來定義 HAL 常量的數量。

HAL 恆定範圍(按紋理和幅度)

圖 7.按紋理 (HAL_H0) 和幅度比例 (S) 劃分的 HAL 常數範圍

HAL-API 常量映射的連續模型

圖 8. HAL-API 常量映射:連續模型

在連續模型中,不同的 HAL 常數代表不同的觸覺紋理,而不是不同的幅度;比例因子 ( S ) 可以配置幅度。但是,由於紋理的感知(例如,銳度)與持續時間和幅度的感知有關,因此建議結合紋理和比例因子(在 HAL-API 映射的設計過程中)。

圖 7 說明了通過增加從一個 HAL 到具有幅度可伸縮性的多個 API 常量的變化來進行的常量映射。

增加變量 1

增加變化 2

圖 9.隨著幅度可擴展性增加變化

注意:上圖說明了常量映射的一個特定實例,因此命名約定是假設的。執行此過程對於每個設備製造商來說都是獨一無二的。

對於VibrationEffect.Composition中的PRIMITIVE_TICKPRIMITIVE_CLICK等所有可擴展 API 常量,API 常量的能級取決於通過addPrimitive(int primitiveID, float scale, int delay)聲明 API 常量時的float scale參數。 PRIMITIVE_TICKPRIMITIVE_CLICK可以通過使用不同的 HAL 常量來設計有明顯的區別。如果您想為紋理添加變化,建議使用此方法。

第 3 步:評估硬件

硬件評估涉及定義三個觸覺效果,標記為效果 1、2 和 3 用於此特定評估。

效果 1:預定義的短觸覺常數

VibrationEffect.EFFECT_CLICK常量是步驟 2 中提供的 HAL-API 映射中的基線效果或公分母。它與最常用的效果HapticFeedbackConstants.KEYBOARD_PRESS映射。評估這種效果有助於確定您的目標設備是否準備好獲得清晰的觸覺

效果 2:短定制觸覺效果

VibrationEffect.createOneShot(20,255)常量用於自定義觸覺效果。對於簡短的單個自定義脈衝,20 ms 是定義持續時間的推薦最大閾值。不建議使用超過 20 毫秒的單個脈衝,因為它會被視為嗡嗡聲

短自定義觸覺效果的波形

圖 10.短定制觸覺效果

效果 3:具有幅度變化的長自定義觸覺效果

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat)常量用於具有幅度變化的長自定義效果。為自定義觸覺效果產生不同幅度的能力是評估設備豐富觸覺能力的指標之一。推薦的timings []amplitudes []分別為{500, 500}{128, 255} ,其幅度從 50% 到 100% 呈遞增趨勢,採樣率為 500 ms。

具有幅度變化的觸覺效果波形

圖 11.具有幅度變化的長自定義觸覺效果

要檢查效果 3 幅度控制的硬件功能,請使用Vibrator.hasAmplitudeControl()方法。結果必須為true ,才能按預期以不同的幅度執行VibrationEffect.createWaveform

主觀觸覺效果評估流程圖

圖 12.觸覺效果 1、2 和 3 的受試者評估

進行主觀評估

要進行快速連貫性檢查,請先進行主觀評估。主觀評估的目的是觀察觸覺效果的幅度,以確定設備是否可以產生具有人類可感知幅度的觸覺。

圍繞這個概念構建的一個具體問題如下所示:設備能否按預期為用戶產生易於感知的觸覺效果?回答此問題可幫助您避免失敗的觸覺,包括用戶感覺不到的難以察覺的觸覺,或波形未按預期產生模式的意外觸覺。