ハプティクスを実装する

デバイス メーカーは通常、デバイスごとに作成されたプライベート アセットの所有者とみなされます。したがって、エンジニアリングの取り組みは多くの場合、デバイス単位で注力します。エコシステム内の他のデバイスとの一貫性にはほとんど注力しません。

これとは正反対に、デベロッパーは各デバイスの技術仕様に関係なく、エコシステム内のすべての Android スマートフォンで動作するアプリを作成することを目指します。このようなアプローチの違いにより、断片化の問題が発生することがあります。たとえば、特定のスマートフォンのハードウェア機能が、アプリ デベロッパーの想定と一致しないことがあります。そのため、一部の 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 要素もありません。定数には、 createPredefined() が呼び出す EFFECT_CLICKEFFECT_HEAVY_CLICK など、エネルギー レベルの概念が含まれます。
PRIMITIVE_TICKPRIMITIVE_CLICKPRIMITIVE_LOW_TICK>PRIMITIVE_SLOW_RISEPRIMITIVE_QUICK_RISEPRIMITIVE_QUICK_FALLPRIMITIVE_SPINPRIMITIVE_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_TICKCONTEXT_CLICKKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASECONFIRMREJECTGESTURE_STARTGESTURE_END HapticFeedbackConstants クラス
HapticFeedbackConstants の触覚定数は、performHapticFeedback() が呼び出す KEYBOARD_PRESSKEYBOARD_RELEASE など、特定の UI 要素での入力イベントを支援します。

ステップ 2: HAL と API の間で定数をマッピングする

ステップ 2 では、公開 HAL 定数と API 定数の間の推奨されるマッピングを示します。ステップ 1 で評価したハードウェアが HAL 定数を実装していない場合は、ステップ 2 を使用して、ステップ 1 で説明したフォールバック パターンを更新して、同様の出力を生成する必要があります。マッピングは、2 つの異なるデフォルト モデルによって支援されます。

  • 非連続モデル(簡単)

    • このモデルの主な変数は振幅です。HAL の各エンティティは異なる触覚振幅を表します。
    • このモデルは、基本的な触覚 UX を実装するために必要な最小要件です。
    • 高度な触覚 UX には、高度なハードウェアと高度なモデル(連続モデル)が必要です。
  • 連続モデル(高度)

    • このモデルの主な変数はテクスチャと振幅です。HAL の各エンティティは異なる触覚テクスチャを表します。各 HAL エンティティの振幅は、スケール係数(S)によって制御されます。
    • このモデルには高度なハードウェアが必要です。OEM が VibrationEffect.Composition で高度な触覚 UX を使用する場合(最新のハプティクス API を活用する場合)は、このモデルを使用してハードウェアを実装することをおすすめします。

非連続モデル

API で提供されるすべてのパブリック定数を、適切な HAL 定数にマッピングすることをおすすめします。このプロセスを開始するには、デバイスが HAL で定義できる、非連続の振幅を持つ触覚波形の数を確認します。この概念に基づいた具体的な質問は次のようになります。「1 台のスマートフォンに、人間が知覚できる振幅差を持つシングル インパルス触覚衝撃をいくつ定義できますか?」この質問に対する回答によってマッピングが決まります。

HAL 定数の定義はハードウェアに依存するプロセスです。たとえば、エントリー レベルのスマートフォンには、単一の触覚波形を生成するハードウェア機能しかないことがあります。より高度なハードウェア コンポーネントを備えたデバイスでは、より広範囲な非連続の振幅レベルが生成され、HAL で複数の触覚波形を定義できます。HAL - API 定数マッピングでは、HAL 定数を(中程度の振幅をベースラインに)使用して、より強い、または弱い効果を合成します。

HAL 定数の範囲とフィードバック振幅の図

図 5. 振幅による HAL 定数の範囲

非連続の振幅を持つ HAL 定数の数を定義したら、HAL 定数と API 定数を HAL 定数の数でマッピングします。このマッピング プロセスでは、シングル インスパルス API 定数を、最大 3 つの振幅レベルの非連続なグループに分割できます。API 定数をセグメント化する方法は、付随する入力イベントの UX 原則に基づきます。詳しくは、ハプティクス UX デザインをご覧ください。

HAL - API 定数マッピングの非連続モデル

図 6. HAL - API 定数マッピング: 非連続モデル

デバイスが、非連続の振幅を持つ 2 つの HAL 定数のみをサポートしている場合は、中振幅レベルと高振幅レベルの HAL 定数を統合することを検討してください。この概念の実例としては、EFFECT_CLICKEFFECT_HEAVY_CLICK を同じ HAL 定数(中振幅レベルの HAL 定数)にマッピングすることが挙げられます。デバイスが、非連続の振幅を持つ 1 つの HAL 定数のみをサポートしている場合は、3 つのレベルをすべて 1 つに統合することをご検討ください。

連続モデル

振幅スケーラビリティがある連続モデルは、HAL 定数を定義するために適用できます。スケール係数(S)を HAL 定数(HAL_H0HAL_H1 など)に適用して、スケールされた HAL(HAL_H0 × S)を生成できます。この場合、図 7 に示すように、スケールされた HAL は API 定数(HAL_H0 × S1 = H0S1 = EFFECT_TICK)を定義するためにマッピングされます。連続モデルの振幅スケーラビリティを使用することで、デバイスは固有のテクスチャを持つ少数の HAL 定数を格納でき、スケール係数(S)を調整することで振幅の変動を追加できます。デバイス メーカーは、提供するさまざまな触覚テクスチャの数に基づいて HAL 定数の数を定義できます。

テクスチャと振幅による HAL 定数の範囲

図 7. テクスチャ(HAL_H0)と振幅スケール(S)による HAL 定数の範囲

HAL - API 定数マッピングの連続モデル

図 8. HAL - API 定数マッピング: 連続モデル

連続モデルでは、異なる HAL 定数は、異なる振幅ではなく、異なる触覚テクスチャを表します。スケール係数(S)で振幅を設定できます。ただし、テクスチャの認識(シャープネスなど)は期間と振幅の認識に関係するため、テクスチャとスケール係数を組み合わせることをおすすめします(HAL - API マッピングの設計プロセス)。

図 7 は、振幅スケーラビリティによって 1 つの HAL から多くの API 定数まで変動を増やす定数マッピングを示しています。

変動増加 1

変動増加 2

図 9. 振幅スケーラビリティによる変動の増加

スケーラブルな API 定数(VibrationEffect.CompositionPRIMITIVE_TICKPRIMITIVE_CLICK など)はすべて、API 定数が addPrimitive(int primitiveID, float scale, int delay) を通じて宣言されている場合、API 定数のエネルギー レベルが float scale パラメータによって異なります。PRIMITIVE_TICKPRIMITIVE_CLICK は、異なる HAL 定数を使用することで明確に区別して設計できます。テクスチャに変動を追加する場合は、この方法をおすすめします。

ステップ 3: ハードウェアを評価する

ハードウェア評価では、この特定の評価のために、効果 1、2、3 というラベルの付いた 3 つの触覚効果を定義します。

効果 1: 事前定義の短い触覚定数

VibrationEffect.EFFECT_CLICK 定数は、ステップ 2 で提供された HAL - API マッピングのベースライン効果または共通点です。これは、よく使用される効果である HapticFeedbackConstants.KEYBOARD_PRESS にマッピングされています。この効果を評価することで、対象デバイスがクリア ハプティクスに対応しているかどうかを判断できます。

効果 2: 短いカスタム触覚効果

VibrationEffect.createOneShot(20,255) 定数は、カスタムの触覚効果用です。短い単一のカスタム インパルスの場合、期間を定義する推奨最大しきい値は 20 ミリ秒です。20 ミリ秒を超える単一インパルスは、うるさいバイブレーションとして認識されるため、おすすめしません。

短いカスタム触覚効果の波形

図 10. 短いカスタム触覚効果

効果 3: 振幅変動を伴う長いカスタム触覚効果

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) 定数は、振幅変動を伴う長いカスタム効果用です。カスタム触覚効果のさまざまな振幅を生成する機能は、リッチ ハプティクスに関するデバイスの機能を評価する指標の 1 つです。推奨される timings []amplitudes [] はそれぞれ {500, 500}{128, 255} です。500 ミリ秒のサンプリング レートで 50% から 100% まで振幅の増加傾向を示します。

振幅変動を伴う触覚効果の波形

図 11. 振幅変動を伴う長いカスタム触覚効果

効果 3 の振幅制御のハードウェア機能を確認するには、Vibrator.hasAmplitudeControl() メソッドを使用します。振幅が想定どおり変化するように VibrationEffect.createWaveform を実行するには、結果が true になる必要があります。

主観的触覚効果評価のフローチャート

図 12. 触覚効果 1、2、3 の主観評価

主観評価を実施する

一貫性チェックをすばやく行うには、まず主観評価を行います。主観評価の目標は、触覚効果の振幅を観察し、人間が認識できる振幅を持つハプティクスをデバイスが生成できるかどうかを判断することです。

この概念に基づいた具体的な質問は次のようになります。「デバイスは、簡単に認識可能な触覚効果をユーザーに対して想定どおり生成できますか?」この質問に答えることで、ユーザーが感じられない認識不能なハプティクスや、波形が想定どおりのパターンを生成しない意図せぬハプティクスなど、ハプティクスの失敗を避けることができます。