ハプティクスを実装する

一般に、デバイスのメーカーは、各デバイス用に作成されたプライベート資産の所有者とみなされます。そのため、エンジニアリングの取り組みは多くの場合、デバイスごとに焦点を当てています。エコシステム内の他のデバイスの一貫性については、ほとんど努力が払われていません。

まったく対照的に、開発者は、各デバイスの技術仕様に関係なく、エコシステム内のすべての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_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 で定義できる離散振幅の触覚波形の数を調べます。この概念に基づいて構成された具体的な質問は次のようになります。人間が知覚できる振幅の違いを持つ単一インパルス触覚効果は、私の携帯電話でいくつ定義できますか?この質問に対する答えによってマッピングが決まります。

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

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

図 5.振幅別の HAL 定数範囲

離散振幅を持つ HAL 定数の数が定義されたら、HAL 定数と API 定数を HAL 定数の数でマップします。このマッピング プロセスでは、単一のインパルス API 定数を最大 3 つの振幅レベルの個別のグループにセグメント化できます。 API 定数がセグメント化される方法は、付随する入力イベントの UX 原則に基づいています。詳細については、 「Haptics UX デザイン」を参照してください。

HAL-API 定数マッピングの離散モデル

図 6. HAL-API 定数マッピング: 離散モデル

デバイスが離散振幅を持つ 2 つの HAL 定数のみをサポートしている場合は、中振幅レベルと高振幅レベルの HAL 定数を結合することを検討してください。この概念の実際の例は、 EFFECT_CLICKEFFECT_HEAVY_CLICKを同じ HAL 定数 (中振幅レベルの HAL 定数) にマッピングすることです。デバイスが離散振幅を持つ HAL 定数を1 つだけサポートしている場合は、3 つのレベルすべてを 1 つにマージすることを検討してください。

連続モデル

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

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

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

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

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

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

図 7 は、振幅スケーラビリティを備えた 1 つの HAL から多数の API 定数への変化を増やすことによる定数マッピングを示しています。

バリエーションの増加 1

バリエーションの増加 2

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

VibrationEffect.CompositionPRIMITIVE_TICKPRIMITIVE_CLICKなどのすべてのスケーラブルな API 定数では、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 の被験者の評価

主観的な評価を実行する

一貫性を簡単にチェックするには、最初に主観的な評価を実行します。主観的評価の目的は、触覚効果の振幅を観察して、デバイスが人間が知覚できる振幅の触覚を生成できるかどうかを判断することです。

この概念に基づいて構成された具体的な質問は次のようになります。デバイスは期待どおりにユーザーに容易に知覚できる触覚効果を生成できますか?この質問に答えると、ユーザーが感じられない知覚できないハプティクスや、波形が意図したとおりのパターンを生成しない意図しないハプティクスなど、失敗したハプティクスを回避するのに役立ちます。