デバイス メーカーは通常、デバイスごとに作成されたプライベート アセットの所有者とみなされます。したがって、エンジニアリングの取り組みは多くの場合、デバイス単位で注力します。エコシステム内の他のデバイスとの一貫性にはほとんど注力しません。
これとは正反対に、デベロッパーは各デバイスの技術仕様に関係なく、エコシステム内のすべての Android スマートフォンで動作するアプリを作成することを目指します。このようなアプローチの違いにより、断片化の問題が発生することがあります。たとえば、特定のスマートフォンのハードウェア機能が、アプリ デベロッパーの想定と一致しないことがあります。そのため、一部の Android スマートフォンで動作するハプティクス API が他の Android スマートフォンでは動作しない場合、結果として一貫性のないエコシステムとなります。こうした理由により、メーカーが Android ハプティクス API をすべてのデバイスに実装できるようにする際、ハードウェア構成が重要な役割を果たします。
このページでは、Android ハプティクス API を活用するために、ハードウェア コンプライアンスを設定するためのチェックリストを示します。
下図は、デバイス メーカーとデベロッパーの間で共通の知識を構築する様子を示しています。これは、一貫性のあるエコシステムを構築するうえで重要なステップです。
図 1. デバイス メーカーとデベロッパーの間の知識の構築
ハプティクス実装チェックリスト
-
- ハプティクスを実装する定数のリスト。
-
- HAL 合成プリミティブの実装ガイダンス。
-
- 公開 API 定数(フレームワークの名前付きプレースホルダ)と、プレースホルダを実装する HAL 定数との間のマッピングの推奨事項。
- このプロセスについて詳しくは、推奨されるマッピングの指針となる設計原則をご覧ください。
-
- ターゲットとする触覚効果についての説明。これにより、ハードウェアのクイック チェックを行います。
以降で、各ステップについて詳しく説明します。
ステップ 1: 定数を実装する
こうした確認を行うことで、ハプティクスを実装する最小要件をデバイスが満たしているかどうかを確認します。
図 2. 効果の実装
図 3. プリミティブの実装
下記の触覚定数の実装ステータスを確認します。
触覚定数 | 場所と概要 |
---|---|
EFFECT_TICK 、EFFECT_CLICK 、EFFECT_HEAVY_CLICK 、EFFECT_DOUBLE_CLICK |
VibrationEffect クラスVibrationEffect の触覚定数には、入力イベントの概念が含まれず、UI 要素もありません。定数には、
createPredefined() が呼び出す EFFECT_CLICK や EFFECT_HEAVY_CLICK など、エネルギー レベルの概念が含まれます。 |
以下で説明する代替のバイブレーションは、VibrationEffect
定数を実装していないデバイスで実行されます。このようなデバイスで最善のパフォーマンスが得られるように、これらの構成を更新することをおすすめします。
EFFECT_CLICK
VibrationEffect.createWaveform
で作成された波形のバイブレーションと、frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern
で設定されたタイミング。EFFECT_HEAVY_CLICK
VibrationEffect.createWaveform
で作成された波形のバイブレーションと、frameworks/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_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 の触覚定数は、performHapticFeedback() が呼び出す KEYBOARD_PRESS や KEYBOARD_RELEASE など、特定の UI 要素での入力イベントを支援します。 |
ステップ 2: プリミティブを実装する
VibrationEffect.Composition
の触覚プリミティブには、デベロッパーが addPrimitive(int primitiveId, float scale, int delay)
を介して使用できるスケーラブルな強度があります。プリミティブは次の 2 つのカテゴリに分けられます。
short プリミティブ: 通常 20 ミリ秒以下の短期間のプリミティブ。
CLICK
、TICK
、LOW_TICK
を指します。chirp プリミティブ: 通常 short プリミティブよりも期間が長い、振幅と周波数が変化するプリミティブ。
SLOW_RISE
、QUICK_RISE
、QUCK_FALL
、THUD
、SPIN
を指します。
short プリミティブ
short プリミティブは、振動モーターの出力加速度プロファイルによって記述できます。使用される絶対周波数はアクチュエータの共振周波数に基づき、プリミティブごとに異なります。出力を測定するためのハードウェア セットアップとツールについて詳しくは、テスト機器をセットアップするをご覧ください。
図 5 に示すように、短い振動の役に立つ品質指標は、パルス対リング比(PRR)です。PRR は、振幅がピーク振幅の 10% まで減少する期間内の電波によって定義されるメインパルスと、振幅がピーク振幅の 10% から 1% 未満まで減少する電波によって定義されるリングパルスの比率のことです。PRR について詳しくは、波形を分析するを、結果の分析と比較について詳しくは、パフォーマンス マップを使用して結果を比較するをご覧ください。
図 5. パルス対リング比の定義
short プリミティブをユーザーからの入力フィードバックとして適用したり、より長い構成で再生して柔らかな質感を作り出したりします。つまり、通常は頻繁にトリガーされ、連続して再生されます。単一の short プリミティブの認識強度は、より大きな効果の強度を複雑にする可能性があります。したがって、単一の tick プリミティブまたは low tick プリミティブを、より大きな構成、たとえば連続 100 ティックで調整してください。
click プリミティブ
click プリミティブは通常、デバイスの共振周波数の近くで動作し、短時間で最大出力に達する、強力でクリアな効果です。他のプリミティブよりも強くて深く、最大の強度で実行します。
可能であれば、モーターの立ち上がりと立ち下がりの時間を短くするために、最初にモーターのオーバードライブを使用し、最後にアクティブ ブレーキを使用してください。モーターによっては、正弦波の代わりに方形波を使用することで、より高速な加速を実現します。図 6 は、click プリミティブの出力加速度プロファイルの例を示しています。
図 6. click プリミティブの出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 12 ミリ秒 上限: < 30 ミリ秒 |
ピーク出力加速度 |
対象: 2 G 上限: > 1 G |
周波数 | 共振周波数とほぼ同じ |
tick プリミティブ(ライトティック)
tick プリミティブは通常、高い周波数帯域幅で動作する鮮明で短い効果です。このプリミティブは、より高い周波数でテールが短い中強度の click と説明されることもあります。モーター オーバードライブまたは矩形波を最初の立ち上がりに使用し、オフセットでアクティブ ブレーキを使用して短い立ち上がり時間を達成する場合にも同じガイダンスが適用されます。図 7 は、tick プリミティブの出力加速度プロファイルの例を示しています。
図 7. tick プリミティブの出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 5 ミリ秒 上限: < 20 ミリ秒 |
ピーク出力加速度 |
対象: 上限: 0.5 G と 1 G の間 |
周波数 |
対象: 共振周波数の 2 倍 上限: < 500 Hz |
low tick プリミティブ
low tick プリミティブはライトティックのよりソフトで弱いバージョンです。より低い周波数範囲で動作し、効果にメリハリをつけます。このプリミティブは、より低い周波数の中程度の強さの click と説明されることもあり、動的なフィードバックのために繰り返し使用されることを意図しています。モーター オーバードライブまたは矩形波を最初に使用し、短い立ち上がり時間を達成する場合にも同じガイダンスが適用されます。図 8 は、low tick プリミティブの出力加速度プロファイルの例を示しています。
図 8. low tick プリミティブの出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 12 ミリ秒 上限: < 30 ミリ秒 |
ピーク出力加速度 |
対象: 上限: 0.2 G と 0.5 G の間 |
周波数 |
対象 2/3 の共振周波数 上限: < 100 Hz |
chirp プリミティブ
chirp プリミティブは、電圧レベルと振動周波数の入力電波によって記述できます。異なる周波数範囲でモーターが出力できる加速度は、アクチュエータの周波数応答曲線によって異なります。周波数範囲と電圧レベルは、デバイスごとに調整する必要があります。
slow rise プリミティブ
slow rise は、ゆっくりとした振幅とソフトな立ち上がりによる上方スイープの周波数で、振動強度はスイープ全体で一貫して増加します。共振を避けて動作するより低い周波数範囲を使用して、振幅と周波数の両方の一貫したスイープによって実装できます。図 9 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右の周波数ラベルと一致し、振動数が時間とともにどのように変化するかを表しています)。
図 9. slow rise プリミティブの入力パラメータと出力加速度プロファイルの例
モーターの周波数応答が制限されている(共振周波数から離れる強度が十分でない)場合は、共振周波数の 1/2 倍から 1 倍まで正弦波スイープによる実装方法もあります。モーターの共振は、最後に電波のピークに達するのに大きく影響します。
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 500 ミリ秒 許容差: 20 ミリ秒 |
ピーク出力加速度 |
対象: 0.5 G 上限: 0.5 G と 1 G の間 |
周波数 |
対象: 共振周波数の 1/2~2/3 代替手段: 共振周波数の 1/2 |
quick rise プリミティブ
quick rise は、より速い振幅とソフトな立ち上がりによる上方スイープの周波数で、振動強度はスイープ全体で一貫して増加します。出力加速度と振動周波数の対象は、slow rise プリミティブと同じでなければならず、より短時間で達成されます。図 10 は、slow rise プリミティブの振動入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右の周波数ラベルと一致し、振動数が時間とともにどのように変化するかを表しています)。
図 10. quick rise プリミティブの入力パラメータと出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 150 ミリ秒 許容差: 20 ミリ秒 |
ピーク出力加速度 |
対象: 上限: |
周波数 |
対象: 代替手段: |
quick fall プリミティブ
quick fall は、急速な振幅とソフトな立ち上がりによる下方スイープの周波数です。ピーク出力加速度に到達するためにモーターが加速している間は、より高い周波数を開始ポイントとして使用できます。周波数は、スイープ全体で一貫して減少している必要があります。これは、立ち上がり時間中でも同様です。図 11 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右の周波数ラベルと一致し、振動数が時間とともにどのように変化するかを表しています)。
図 11. quick fall プリミティブの入力パラメータと出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 100 ミリ秒 許容差: 20 ミリ秒 |
ピーク出力加速度 |
対象: 1 G 上限: 0.5 G と 2 G の間 |
周波数 |
対象: 共振周波数の 2x~1x |
thud プリミティブ
thud は、空洞のある木をたたくような身体的な感覚をシミュレートする、ドスンと響く低い打音の効果です。このプリミティブは、low tick プリミティブと同様に低周波数帯域で動作し、効果にメリハリをつけます。低周波数帯域(100 Hz 未満が望ましい)での振幅と周波数の下方スイープとして thud プリミティブを実装できます。図 12 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右の周波数ラベルと一致し、振動数が時間とともにどのように変化するかを表しています)。
図 12. thud プリミティブの入力パラメータと出力加速度プロファイルの例
モーターの周波数応答が制限されている場合は、共振周波数でフル強度のドライブ電波から開始し、知覚できる可能な限り低い周波数まで下げる実装方法もあります。この方法では、振動を感じるために、低い周波数でのドライブ電波強度を上げる必要がある可能性があります。
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 300 ミリ秒 許容差: 20 ミリ秒 |
ピーク出力加速度 |
対象: 0.25 G 上限: 0.2 G と 0.5 G の間 |
周波数 |
対象: 共振周波数の 1/2~1/3 代替手段: 共振周波数の 1x~1/2 |
spin プリミティブ
spin は、中央でわずかにアクセントをつけながら、上下に速く回転する勢いをシミュレートしています。spin は、振幅と周波数を別々に逆方向にスイープし、その後に逆方向の動きをさせることで実装できます。低周波数帯域(100 Hz 未満が望ましい)を使用することが重要です。図 13 は、この実装の入力パラメータと出力加速度プロファイルの例を示しています(赤い線は左の振幅ラベルと一致し、振動振幅が時間とともにどのように変化するかを表しています。青い線は右の周波数ラベルと一致し、振動数が時間とともにどのように変化するかを表しています)。
回転するような不安定な感覚を得るために、spin プリミティブを 2 回、または 3 回連続で呼び出すことをおすすめします。
モーターの周波数応答が制限されている場合、共振周波数の 1/2 倍から 1 倍とその逆で、急速な正弦波スイープを行う実装方法もあります。モーターの共振は、自動的に電波にアクセントを与えます。
図 13. spin プリミティブの入力パラメータと出力加速度プロファイルの例
パラメータ | ガイドライン |
---|---|
所要時間 |
対象: 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 で説明したフォールバック パターンを更新して、同様の出力を生成する必要があります。マッピングは、2 つの異なるデフォルト モデルによって支援されます。
非連続モデル(簡単)
- このモデルの主な変数は振幅です。HAL の各エンティティは異なる触覚振幅を表します。
- このモデルは、基本的な触覚 UX を実装するために必要な最小要件です。
- 高度な触覚 UX には、高度なハードウェアと高度なモデル(連続モデル)が必要です。
連続モデル(高度)
- このモデルの主な変数はテクスチャと振幅です。HAL の各エンティティは異なる触覚テクスチャを表します。各 HAL エンティティの振幅は、スケール係数(
S
)によって制御されます。 - このモデルには高度なハードウェアが必要です。OEM が
VibrationEffect.Composition
で高度な触覚 UX を使用する場合(最新のハプティクス API を活用する場合)は、このモデルを使用してハードウェアを実装することをおすすめします。
- このモデルの主な変数はテクスチャと振幅です。HAL の各エンティティは異なる触覚テクスチャを表します。各 HAL エンティティの振幅は、スケール係数(
非連続モデル
API で提供されるすべてのパブリック定数を、適切な HAL 定数にマッピングすることをおすすめします。このプロセスを開始するには、デバイスが HAL で定義できる、非連続の振幅を持つ触覚波形の数を確認します。この概念に基づいた具体的な質問は次のようになります。「1 台のスマートフォンに、人間が知覚できる振幅差を持つシングル インパルス触覚衝撃をいくつ定義できますか?」この質問に対する回答によってマッピングが決まります。
HAL 定数の定義はハードウェアに依存するプロセスです。たとえば、エントリー レベルのスマートフォンには、単一の触覚波形を生成するハードウェア機能しかないことがあります。より高度なハードウェア コンポーネントを備えたデバイスでは、より広範囲な非連続の振幅レベルが生成され、HAL で複数の触覚波形を定義できます。HAL - API 定数マッピングでは、HAL 定数を(中程度の振幅をベースラインに)使用して、より強い、または弱い効果を合成します。
図 14. 振幅による HAL 定数の範囲
非連続の振幅を持つ HAL 定数の数を定義したら、HAL 定数と API 定数を HAL 定数の数でマッピングします。このマッピング プロセスでは、シングル インスパルス API 定数を、最大 3 つの振幅レベルの非連続なグループに分割できます。API 定数をセグメント化する方法は、付随する入力イベントの UX 原則に基づきます。詳しくは、ハプティクス UX デザインをご覧ください。
図 15. HAL - API 定数マッピング: 非連続モデル
デバイスが、非連続の振幅を持つ 2 つの HAL 定数のみをサポートしている場合は、中振幅レベルと高振幅レベルの HAL 定数を統合することを検討してください。この概念の実例としては、EFFECT_CLICK
と EFFECT_HEAVY_CLICK
を同じ HAL 定数(中振幅レベルの HAL 定数)にマッピングすることが挙げられます。デバイスが、非連続の振幅を持つ 1 つの HAL 定数のみをサポートしている場合は、3 つのレベルをすべて 1 つに統合することをご検討ください。
連続モデル
振幅スケーラビリティがある連続モデルは、HAL 定数を定義するために適用できます。スケール係数(S
)を HAL 定数(HAL_H0
、HAL_H1
など)に適用して、スケールされた HAL(HAL_H0
× S
)を生成できます。この場合、図 16 に示すように、スケールされた HAL は API 定数(HAL_H0
× S1
= H0S1
= EFFECT_TICK
)を定義するためにマッピングされます。連続モデルの振幅スケーラビリティを使用することで、デバイスは固有のテクスチャを持つ少数の HAL 定数を格納でき、スケール係数(S
)を調整することで振幅の変動を追加できます。デバイス メーカーは、提供するさまざまな触覚テクスチャの数に基づいて HAL 定数の数を定義できます。
図 16. テクスチャ(HAL_H0)と振幅スケール(S)による HAL 定数の範囲
図 17. HAL - API 定数マッピング: 連続モデル
連続モデルでは、異なる HAL 定数は、異なる振幅ではなく、異なる触覚テクスチャを表します。スケール係数(S
)で振幅を設定できます。ただし、テクスチャの認識(シャープネスなど)は期間と振幅の認識に関係するため、テクスチャとスケール係数を組み合わせることをおすすめします(HAL - API マッピングの設計プロセス)。
図 18 は、振幅スケーラビリティによって 1 つの HAL から多くの API 定数まで変動を増やす定数マッピングを示しています。
図 18. 振幅スケーラビリティによる変動の増加
スケーラブルな API 定数(VibrationEffect.Composition
の PRIMITIVE_TICK
や PRIMITIVE_CLICK
など)はすべて、API 定数が addPrimitive(int primitiveID, float scale,
int delay)
を通じて宣言されている場合、API 定数のエネルギー レベルが float scale
パラメータによって異なります。PRIMITIVE_TICK
と PRIMITIVE_CLICK
は、異なる HAL 定数を使用することで明確に区別して設計できます。テクスチャに変動を追加する場合は、この方法をおすすめします。
ステップ 4: ハードウェアを評価する
ハードウェア評価では、この特定の評価のために、効果 1、2、3 というラベルの付いた 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}
です。500 ミリ秒のサンプリング レートで 50% から 100% まで振幅の増加傾向を示します。
図 20. 振幅変動を伴う長いカスタム触覚効果
効果 3 の振幅制御のハードウェア機能を確認するには、Vibrator.hasAmplitudeControl()
メソッドを使用します。振幅が想定どおり変化するように VibrationEffect.createWaveform
を実行するには、結果が true
になる必要があります。
図 21. 触覚効果 1、2、3 の主観評価
主観評価を実施する
一貫性チェックをすばやく行うには、まず主観評価を行います。主観評価の目標は、触覚効果の振幅を観察し、人間が認識できる振幅を持つハプティクスをデバイスが生成できるかどうかを判断することです。
この概念に基づいた具体的な質問は次のようになります。「デバイスは、認識可能な触覚効果をユーザーに対して想定どおり生成できますか?」この質問に答えることで、ユーザーが感じられない認識不能なハプティクスや、波形が想定どおりのパターンを生成しない意図せぬハプティクスなど、ハプティクスの失敗を避けることができます。
高度な評価を実施する
高度な品質評価を実施することを強くおすすめします。高度な品質評価では、触覚効果の定量化可能な属性を特徴づけて、高品質なハプティクスを実装します。終了すると、デバイス メーカーは現在の触覚ステータスを診断できるようになります。つまり、全体的な品質を改善する目標を設定できます。ハードウェア評価をご覧ください。