Android TV でのカスタムビューのユーザー補助サポート

多くの Android TV アプリはネイティブの Android コンポーネントで構築されていますが、 サードパーティ アプリがアクセスしやすく、 フレームワークやコンポーネントで、特にカスタムビューを使用する場合は特に重要になります。

OpenGL または Canvas と直接やり取りするカスタムビュー コンポーネントが適切に機能しない可能性がある TalkBack やスイッチ アクセスなどのユーザー補助サービスも提供しています。

TalkBack への切り替え時に発生する可能性のある、以下の問題を検討します。 日付:

  • アプリでユーザー補助のフォーカス(緑色の長方形)が消えることがあります。
  • ユーザー補助フォーカスで画面全体の境界が選択されることがあります。
  • ユーザー補助のフォーカスは移動できない場合があります。
  • D-pad の 4 つの方向キーは、コードで処理されていても効果がない場合があります。

アプリで次のいずれかの問題が発生した場合は、 アプリが AccessibilityNodeInfo を公開している ユーザー補助サービスに移動できます。

このガイドの残りの部分では、これらの問題に対処するためのソリューションとベスト プラクティスをいくつか紹介します。

D-pad イベントはユーザー補助サービスによって使用される

この問題の根本原因は、キーイベントがユーザー補助によって消費されることです。 提供します。

D-pad イベントの使用量 図 1. TalkBack をオンまたはオフにした場合のシステムの動作を示す図。

図 1 に示すように、TalkBack をオンにすると、D-pad のイベント デベロッパーが定義した D-pad ハンドラには渡されない。代わりに ユーザー補助サービスはキーイベントを受信し、 ユーザー補助を重視していますカスタム Android コンポーネントは、デフォルトでは 画面上の位置に関する情報をユーザー補助サービスに提供します。 ユーザー補助サービスは、ユーザー補助のフォーカスを移動してハイライト表示することはできません。

他のユーザー補助サービスも同様に影響を受けます。D-pad のイベントも アクセスを制御できます

D-pad のイベントはユーザー補助サービスに送信され、 そのサービスは UI コンポーネントがカスタムビューのどこにあるかを認識しません。 転送するように、アプリに AccessibilityNodeInfo を実装する必要があります。 キーイベントを正しく予測できます。

ユーザー補助サービスに情報を公開する

アクセスに関する十分な情報をユーザー補助サービスに提供し、 カスタムビューの場所と説明、AccessibilityNodeInfo を実装する 各コンポーネントの詳細を公開します。 ビューの論理関係を定義して、ユーザー補助サービスが フォーカスの管理、ExploreByTouchHelper の実装 使用して設定します。 ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) カスタムビューです

ExploreByTouchHelper を実装するときは、次の 4 つの抽象メソッドをオーバーライドします。

Kotlin

// Return the virtual view ID whose view is covered by the input point (x, y).
protected fun getVirtualViewAt(x: Float, y: Float): Int

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected fun getVisibleVirtualViews(virtualViewIds: List<Int>)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat)

// Set the accessibility handling when perform action.
protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean

Java

// Return the virtual view ID whose view is covered by the input point (x, y).
protected int getVirtualViewAt(float x, float y)

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected void getVisibleVirtualViews(List<Integer> virtualViewIds)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node)

// Set the accessibility handling when perform action.
protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)

詳しくは、Google I/O 2013 - Potential Blind and Low-Vision をご覧ください。 Android のユーザー補助機能 または、ユーザー補助イベントの入力の詳細をご覧ください。

おすすめの方法

サンプル

ベスト プラクティスについては、Android TV 用のカスタムビューのユーザー補助サンプルをご覧ください。 カスタムビューを使用してアプリにユーザー補助サポートを追加する。