實作觸覺技術

裝置製造商通常會被視為為每部裝置建立的私人資產擁有者。因此,他們的工程工作通常著重於個別裝置,對生態系統中其他裝置的一致性則幾乎不做任何努力。

相反地,開發人員會盡力建構可在生態系統中所有 Android 手機上運作的應用程式,無論各裝置的技術規格為何都沒問題。這種方法上的差異可能會導致分散化問題,例如某些手機的硬體功能不符合應用程式開發人員設定的預期。因此,如果觸覺回饋 API 在某些 Android 手機上運作,但在其他手機上無法運作,就會導致生態系統不一致。因此,硬體設定在確保製造商可在每部裝置上實作 Android 觸覺回饋 API 方面,扮演著舉足輕重的角色。

本頁面提供逐步檢查清單,協助您設定硬體相容性,以便充分運用 Android 觸覺回饋 API。

下圖說明如何在裝置製造商和開發人員之間建立共同知識,這是建立完整生態系統的重要步驟:

應用程式開發人員和裝置製造商的觸覺回饋用途圖表

圖 1. 協助裝置製造商和開發人員建立知識

觸覺回饋實作檢查清單

  1. 實作常數

    • 實作觸覺回饋的常數清單。
  2. 實作原始物件

    • HAL 組合原始類型的實作指南。
  3. 在 HAL 和 API 之間對應常數

  4. 評估硬體

    • 指定觸覺回饋效果的操作說明。請按照以下操作說明快速檢查硬體。

我們將在下文中詳細說明各個步驟。

步驟 1:實作常數

請執行以下檢查,判斷裝置是否符合實作觸覺回饋的最低需求:

觸覺回饋實作程序的流程圖

圖 2. 實作效果

實作基本元素的步驟流程圖

圖 3. 實作基本元素

檢查下列觸覺回饋常數的實作狀態。

觸覺回饋常數 位置和摘要
EFFECT_TICKEFFECT_CLICKEFFECT_HEAVY_CLICKEFFECT_DOUBLE_CLICK VibrationEffect 類別
VibrationEffect 中的觸覺常數不含任何輸入事件概念,也沒有 UI 元素。常數則包含能量層級的概念,例如 EFFECT_CLICKEFFECT_HEAVY_CLICK,這些項目會由 createPredefined() 呼叫。

下文所述的替代震動功能,適用於未實作 VibrationEffect 常數的裝置。建議您更新這些設定,以便在這些裝置上獲得最佳效能。

  • EFFECT_CLICK

    使用 VibrationEffect.createWaveform 建立的振動波形,以及在 frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern 中設定的時間。

  • EFFECT_HEAVY_CLICK

    使用 VibrationEffect.createWaveformframeworks/base/core/res/res/values/config.xml##config_longPressVibePattern 所設定的時間,建立的振動波形。

    • EFFECT_DOUBLE_CLICK

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

  • EFFECT_TICK

    使用 VibrationEffect.createWaveform 建立的振動波形,以及在 frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern 中設定的時間。

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

圖 4. 實作意見回饋常數

檢查下列公開意見回饋常數的狀態。

觸覺回饋常數 位置和摘要
CLOCK_TICKCONTEXT_CLICKKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASECONFIRMREJECTGESTURE_STARTGESTURE_END HapticFeedbackConstants 類別
HapticFeedbackConstants 中的觸覺常數可協助輸入事件使用特定 UI 元素,例如 KEYBOARD_PRESSKEYBOARD_RELEASE,這些元素會由 performHapticFeedback() 呼叫。

步驟 2:實作基本元素

VibrationEffect.Composition 中的觸覺原始元素具有可調整強度,開發人員可以透過 addPrimitive(int primitiveId, float scale, int delay) 使用。原始類型可分為兩類:

  • 短暫圖元:短暫圖元通常持續時間短,通常少於 20 毫秒。這些圖元包括 CLICKTICKLOW_TICK

  • 顫音原始物件:具有不同振幅和頻率的原始物件,通常比短原始物件持續時間更長。分別是 SLOW_RISEQUICK_RISEQUCK_FALLTHUDSPIN

短原始物件

短原語元可透過震動馬達輸出加速度設定檔來描述。每個原始元素使用的絕對頻率會因致動器的共振頻率而異。如要進一步瞭解硬體設定和用於測量輸出的工具,請參閱「設定測試設備」。

脈衝與振鈴比率 (PRR) 是短暫震動的有用品質指標,如圖 5 所示。PRR 的定義為「主脈衝」與「環狀脈衝」之間的比率。主脈衝的定義是指在持續時間視窗內的信號,其中振幅會降低至峰值振幅的 10%;環狀脈衝的定義是指在信號中,振幅會從峰值振幅的 10% 降低至峰值振幅的 1% 以下。如要進一步瞭解 PRR,請參閱「分析波形」一文;如要進一步瞭解如何分析及比較結果,請參閱「使用效能地圖比較結果」。

脈衝至鈴聲比率

圖 5. 脈衝與鈴聲比率定義

將短原型做為使用者輸入的意見回饋,或在較長的組合中播放,以建立柔和的紋理。也就是說,這類音效通常會經常觸發並快速連續播放。單一短原型的感知強度可能會加成更大的效果強度。因此,請使用較大的組合 (例如 100 個連續刻度) 校正單一刻度或低刻度原始元素。

點擊原始碼

點擊原始碼是一種強烈、清晰的效果,通常會在接近裝置共振頻率的情況下運作,以便在短時間內達到最大輸出量。它比其他原始類型更強大、更深入,可發揮最大強度。

如果可行,請在開始時使用馬達超載,並在結束時使用主動煞車,以縮短馬達的升降時間。對於某些馬達,使用方波而非正弦波可加快加速度。圖 6 顯示點擊基本元素的輸出加速度設定檔範例:

按一下基本輸出加速度設定檔

圖 6. 點擊基本元素的輸出加速設定檔範例

參數 指南
時間長度

目標:12 毫秒

限制:少於 30 毫秒

輸出加速度的峰值

目標:2 G

限制:> 1 G

頻率 大致處於共振頻率

Tick 原始物件 (輕型 Tick)

時脈原始元素是一種短暫且銳利的效果,通常會在較高的頻率範圍內運作。這個原始元素也可以視為高頻率的中強度點擊,且尾端較短。同樣的指引也適用於使用馬達超載或方波達到短暫升降時間,以及在偏移處啟動煞車。圖 7 顯示了 tick 基本元素的輸出加速度設定檔範例:

勾選原始輸出加速設定檔

圖 7. 時標原始元素的輸出加速度設定檔範例

參數 指南
時間長度

目標:5 毫秒

限制:< 20 毫秒

輸出加速度的峰值

目標:CLICK 的一半,1 G

限制:介於 0.5 G 和 1 G 之間

頻率

目標:2 倍共振頻率

限制:< 500 Hz

低速計時原始碼

低音符原始元素是輕音符的較柔和、較弱的版本,在較低的頻率範圍內運作,可為效果提供更多身體。這個原始元素也可以視為低頻率的中強度點擊,可用於動態回饋的反覆使用。如要使用馬達過載或方波達到短暫的上升時間,同樣適用於初始起始點。圖 8 顯示低時脈原始物件的輸出加速度設定檔範例:

低速計時器原始輸出加速設定檔

圖 8. 低時脈原始物件的輸出加速度設定檔範例

參數 指南
時間長度

目標:12 毫秒

限制:少於 30 毫秒

輸出加速度的峰值

目標:1/4 TICK,0.25 G

限制:介於 0.2 G 和 0.5 G

頻率

目標:2/3 共振頻率

限制:< 100 Hz

Chirp 原始物件

可以使用電壓層級和振動頻率的輸入訊號,描述唧唧鳥原語。馬達在不同頻率範圍內可輸出的加速度,取決於致動器的頻率回應曲線。頻率範圍和電壓等級必須根據裝置調整。

緩慢上升原始碼

緩慢上升是指振幅和頻率緩慢向上掃描,並在掃描過程中持續增加振動強度。這可以透過一致的振幅和頻率掃描實現,使用較低的頻率範圍,以便在非共振狀態下運作。圖 9 顯示此實作項目的輸入參數和輸出加速度設定檔範例。(紅線與左側振幅標籤相符,代表振幅如何隨時間變化。藍線與右側的頻率標籤相符,代表振動頻率隨時間變化的情形)。

輸入參數和輸出加速度設定檔 (適用於緩慢上升原始物件)

圖 9.輸入參數和輸出加速度設定檔範例 (適用於緩慢上升原始物件)

如果馬達的頻率回應受限 (離諧振頻率不夠強),則可改用從 1/2x 到 1x 諧振頻率的正弦掃描。馬達共振有助於在結尾處達到信號峰值。

參數 指南
時間長度

目標:500 毫秒

容差:20 毫秒

輸出加速度的峰值

目標:0.5 G

限制:介於 0.5 G 和 1 G 之間

頻率

目標:共振頻率的 1/2 到 2/3

替代方案:1/2 到諧振頻率

快速上升原始物件

快速上升是指振幅和頻率以較快的速度向上掃描,並在掃描過程中持續增加振動強度,且開始時會以較輕柔的方式進行。輸出加速度和振動頻率目標應與緩慢上升原始碼相同,但在較短的時間內達成。圖 10 顯示慢速上升原始碼的震動輸入參數和輸出加速度設定檔範例。(紅線與左側振幅標籤相符,代表振幅如何隨時間變化。藍線與右側的頻率標籤相符,代表振動頻率隨時間變化的情形)。

快速上升原始圖形的輸入參數和輸出加速度設定檔

圖 10. 快速上升原始圖形的輸入參數和輸出加速度設定檔範例

參數 指南
時間長度

目標:150 毫秒

容差:20 毫秒

輸出加速度的峰值

目標:與 SLOW_RISE 相同

上限:與 SLOW_RISE 相同

頻率

目標:與 SLOW_RISE 相同

替代做法:與 SLOW_RISE 相同

快速墜落原始物件

快速下降是指幅度和頻率快速下降,且開始時較為平緩。當馬達加速至達到最高輸出加速度時,您可以使用較高的頻率做為起始點。頻率應在掃描期間持續下降,即使是在上升時間也是如此。圖 11 顯示此實作項目的輸入參數和輸出加速度設定檔範例。(紅線與左側振幅標籤相符,代表振幅如何隨時間變化。藍線與右側的頻率標籤相符,代表振動頻率隨時間變化的情形)。

快速下落圖元的輸入參數和輸出加速度設定檔

圖 11. 快速下降原型的輸入參數和輸出加速度設定檔範例

參數 指南
時間長度

目標:100 毫秒

容差:20 毫秒

輸出加速度的峰值

目標:1 G

限制:介於 0.5 G 和 2 G 之間

頻率

目標:2 倍至 1 倍共振頻率

Thud 原始物件

咚咚聲是一種低沉的敲擊效果,模擬敲擊空心木頭的物理感覺。這個基本元素會在低頻率範圍內運作,類似於低 tick 基本元素,可為效果提供更多內容。您可以將 thud 原始元素實作為振幅和頻率的向下掃描,頻率範圍應低於 100 Hz。圖 12 顯示此實作項目的輸入參數和輸出加速度設定檔範例。(紅線與左側振幅標籤相符,代表振幅隨著時間的變化情形。藍線與右側的頻率標籤相符,代表振動頻率隨時間變化的情形)。

THUD 基本圖形的輸入參數和輸出加速度設定檔

圖 12. 輸入參數和 THUD 原始物件的輸出加速度設定檔範例

如果馬達的頻率回應受限,則可改為從共振頻率的完整強度驅動信號開始,然後降至可感知的最低頻率。這種做法可能需要在較低頻率下增加驅動信號強度,才能感受到震動。

參數 指南
時間長度

目標:300 毫秒

容差:20 毫秒

輸出加速度的峰值

目標:0.25 G

限制:介於 0.2 G 和 0.5 G

頻率

目標:共振頻率的 1/2 到 1/3

替代做法:1 到 1/2 倍的共振頻率

旋轉原始碼

旋轉效果會模擬快速上下旋轉的旋轉動力,並在中心略微強調。您可以透過以相反方向獨立掃描振幅和頻率,然後再執行反向動作,實現旋轉效果。請務必使用較低的頻率範圍 (最好低於 100 Hz)。圖 13 顯示此實作項目的輸入參數和輸出加速度設定檔範例。(紅線與左側振幅標籤相符,代表振幅如何隨時間變化。藍線與右側的頻率標籤相符,代表振動頻率隨時間變化的情形)。

建議連續兩次呼叫旋轉基本元素,或在組合中呼叫三次,以便產生旋轉和不穩定的效果。

如果馬達的頻率響應受限,則可改為執行快速正弦掃描,從共振頻率的 1/2x 到 1x 掃描,再從 1x 掃描回 1/2x。馬達共振會自動在訊號中加入重音。

旋轉圖元的輸入參數和輸出加速度設定檔

圖 13. 旋轉圖元輸入參數和輸出加速度設定檔範例

參數 指南
時間長度

目標:150 毫秒

容差:20 毫秒

輸出加速度的峰值

目標:0.5 G

限制:介於 0.25 G 和 0.75 G 之間

頻率

目標:2/3 到 1/3,然後回到共振頻率的 1/2

替代做法:從 2/3 到 1x,然後回到共振頻率的 1/2

步驟 3:在 HAL 和 API 之間對應常數

步驟 3 會列出公開 HAL 常數和 API 常數之間的建議對應項目。如果在步驟 1 中評估的硬體未實作 HAL 常數,請使用步驟 3 更新步驟 1 中所述的備用模式,以便產生類似的輸出內容。對應作業可透過兩種不同的預設模型協助完成:

  • 離散模型 (簡單)

    • 振幅是這個模型的重要變數。HAL 中的每個實體都代表不同的觸覺振幅。
    • 這個模型是實作基本觸覺 UX 所需的最低要求。
    • 更進階的觸覺回饋使用者體驗需要進階硬體和進階模型 (持續性模型)。
  • 持續式模型 (進階)

    • 紋理和振幅是這個模型的重要變數。HAL 中的每個實體都代表不同的觸覺回饋紋理。每個 HAL 實體的振幅都由縮放因子 (S) 控制。
    • 這個模型需要進階硬體。如果原始設備製造商 (OEM) 想使用進階觸覺回饋使用者體驗,並搭配 VibrationEffect.Composition (以便充分運用最新的觸覺回饋 API),建議使用此模型導入硬體。

離散模型

建議您將 API 中提供的所有公開常數與適當的 HAL 常數對應。如要開始這項程序,請找出裝置可在 HAL 中定義多少個具有離散振幅的觸覺波形。以該概念為架構的具體問題如下:在手機中,可以定義多少種單一衝動觸覺效果,且這些效果的振幅差異可供人類感知?這項問題的答案會決定對應方式。

定義 HAL 常數是硬體相關的程序。舉例來說,入門級手機可能只有產生單一觸覺回饋波形的硬體功能。配備更先進硬體元件的裝置可產生更廣泛的離散振幅等級,並可在 HAL 中定義多種觸覺回饋波形。HAL-API 常數對應會採用 HAL 常數 (使用中等振幅做為基準),然後安排較強或較弱的效果。

HAL 常數範圍和回饋振幅的示意圖

圖 14. 依振幅計算的 HAL 常數範圍

定義具有離散振幅的 HAL 常數數量後,就可以根據 HAL 常數數量對應 HAL 和 API 常數。這項對應程序可將單一衝量 API 常數區分為最多三個幅度層級群組。API 常數的區隔方式,是根據隨附輸入事件的使用者體驗原則。詳情請參閱「觸覺回饋使用者體驗設計」。

HAL-API 常數對應的離散模型

圖 15. 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),如圖 16 所示。透過連續模型的振幅可擴展性,裝置可儲存少量具有獨特觸覺回饋紋理的 HAL 常數,並透過調整比例因數 (S) 新增振幅變化。裝置製造商可根據要提供的不同觸覺回饋紋理數量,定義 HAL 常數的數量。

根據紋理和振幅設定 HAL 常數範圍

圖 16. 根據紋理 (HAL_H0) 和振幅縮放比例 (S) 設定 HAL 常數範圍

HAL-API 常數對應的連續模型

圖 17. HAL-API 常數對應:連續模式

在連續模型中,不同的 HAL 常數代表不同的觸覺紋理,而非不同的振幅;縮放比例 (S) 可設定振幅。不過,由於紋理感知 (例如清晰度) 與時間和振幅感知相關,因此建議在 HAL API 對應的設計過程中,結合紋理和縮放比例。

圖 18 說明常數對應,從一個 HAL 到多個 API 常數,並增加振幅可擴展性。

增加變化版本 1

增加變化版本 2

圖 18. 利用振幅擴展功能增加變化

對於所有可調整的 API 常數 (例如 VibrationEffect.Composition 中的 PRIMITIVE_TICKPRIMITIVE_CLICK),如果 API 常數是透過 addPrimitive(int primitiveID, float scale, int delay) 宣告,則 API 常數的能量等級會取決於 float scale 參數。PRIMITIVE_TICKPRIMITIVE_CLICK 可使用不同的 HAL 常數進行設計,以便清楚區分。如果您想為紋理新增變化,建議採用這種做法。

步驟 4:評估硬體

硬體評估涉及定義三種觸覺效果,在本評估中分別標示為「效果 1」、「效果 2」和「效果 3」。

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

VibrationEffect.EFFECT_CLICK 常數是步驟 2 中提供的 HAL-API 對應項目中的基準效果或共同分母。並與最常用的效果 HapticFeedbackConstants.KEYBOARD_PRESS 對應。評估這項效果有助於判斷目標裝置是否可支援清晰觸覺回饋

效果 2:短暫自訂觸覺技術效果

VibrationEffect.createOneShot(20,255) 常數用於自訂觸覺技術效果。針對短暫的單一自訂脈衝,建議的時間長度上限為 20 毫秒。不建議使用長度超過 20 毫秒的單一脈衝,因為系統會將其視為嗡嗡作響的震動

短暫自訂觸覺效果的波形

圖 19. 短暫自訂觸覺技術效果

效果 3:長時間自訂觸覺技術效果,並變更振幅

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) 常數適用於長型自訂效果,可變化振幅。產生不同振幅的自訂觸覺效果的能力,是評估裝置豐富觸覺效果能力的指標之一。建議的 timings []amplitudes [] 分別為 {500, 500}{128, 255},分別呈現從 50% 到 100% 的幅度升幅趨勢,取樣率為 500 毫秒。

振幅變化的觸覺效果波形

圖 20. 長時間自訂觸覺技術效果 (振幅變化)

如要檢查效果 3 的振幅控制功能硬體功能,請使用 Vibrator.hasAmplitudeControl() 方法。結果必須是 true,才能依預期執行 VibrationEffect.createWaveform,並以不同的振幅變化。

主觀觸覺效果評估流程圖

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

進行主觀評估

如要快速檢查一致性,請先進行主觀評估。主觀評估的目標是觀察觸覺效果的振幅,以判斷裝置是否能產生人類可感知的振幅觸覺效果。

以這項概念為架構的具體問題如下:裝置是否能如預期為使用者產生可感知的觸覺效果?回答這個問題有助於避免觸覺回饋失敗,包括使用者無法感覺到的微弱觸覺回饋,或是波形未按照預期產生模式的非預期觸覺回饋。

執行進階評估

強烈建議您進行進階品質評估。進階品質評估可描述觸覺效果的可量化屬性,以實現高品質的觸覺效果。完成後,裝置製造商應可診斷目前的觸覺回饋狀態,也就是說,他們可以設定目標來改善整體品質。請參閱「硬體評估」一節。