タッチデバイス

Android は、タッチペン ベースのデジタイザー タブレットなど、さまざまなタッチ スクリーンとタッチパッドに対応しています。

タッチ スクリーンは、ディスプレイに関連付けられたタッチデバイスであり、ユーザーに画面上のコンテンツを直接操作しているかのような印象を与えます。

タッチパッドは、ディスプレイに関連付けられていないタッチデバイスで、デジタイザー タブレットなどがあります。通常、タッチパッドは、ポイント、絶対位置での間接ポジショニング、ジェスチャー ベースのユーザー インターフェース制御に使用されます。

タッチデバイスには、マウスボタンのように機能するボタンが備え付けられている場合があります。

タッチセンサー技術を応用して、指やタッチペンなどのさまざまなツールを使用して操作できる場合もあります。

また、タッチデバイスは、仮想キーの実装に使用されることもあります。たとえば、一部の Android デバイスでは、タッチ スクリーンのセンサー領域がディスプレイの端を越えて広がり、タッチ操作キーパッドの一部としても機能します。

タッチデバイスは多種多様であるため、Android は多数の構成プロパティを使用して、各デバイスの特性や期待される動作について記述しています。

タッチデバイスの分類

次の条件の両方に該当する場合、入力デバイスはマルチタッチ デバイスに分類されます。

  • 入力デバイスが ABS_MT_POSITION_X および ABS_MT_POSITION_Y の絶対軸があることをレポートする。
  • 入力デバイスにゲームパッド ボタンがない。一部のゲームパッドでは、MT 軸のコードと重複するコードで軸がレポートされますが、このようなあいまいさはこの条件によって解消されます。

次の条件の両方に該当する場合、入力デバイスはシングルタッチ デバイスに分類されます。

  • 入力デバイスがマルチタッチ デバイスに分類されていない。入力デバイスがシングルタッチ デバイスまたはマルチタッチ デバイスのいずれかに分類され、両方には分類されていない。
  • 入力デバイスが ABS_X および ABS_Y の絶対軸と、BTN_TOUCH キーコードがあることをレポートする。

入力デバイスがタッチデバイスに分類されると、デバイスの仮想キーマップ ファイルの読み込みが行えるか試され、仮想キーの有無が判別されます。仮想キーマップが利用可能な場合、デバイスのキーレイアウト ファイルも読み込まれます。このようなファイルの場所と形式について詳しくは、[仮想キーマップ ファイル](#virtual-key-map-files)をご覧ください。

次に、システムによりタッチデバイスの入力デバイス設定ファイルが読み込みまれます。

すべての組み込みタッチデバイスには、入力デバイス設定ファイルが必要です。入力デバイス設定ファイルがない場合は、汎用タッチ周辺機器(外部 USB、Bluetooth HID タッチ スクリーン、タッチパッドなど)に適したデフォルト設定が選択されます。このようなデフォルト設定は組み込みタッチ スクリーン用に設計されていないため、不適切な動作につながる場合があります。

入力デバイス設定が読み込まれると、入力デバイスはタッチ スクリーン、タッチパッド、ポインタ デバイスのいずれかに分類されます。

  • タッチ スクリーン デバイスは、画面上のオブジェクトを直接操作するために使用されます。ユーザーは画面に直接触れるため、操作中のオブジェクトを示すアフォーダンスを追加する必要はありません。
  • タッチパッド デバイスは、対象のセンサー領域上の接触に関する絶対位置情報をアプリに提供するために使用されます。デジタイザー タブレットで役に立ちます。
  • ポインタ デバイスは、カーソルで画面上のオブジェクトを間接的に操作するために使用されます。指はマルチタッチ ポインタ ジェスチャーとして解釈されます。タッチペンなどの他のツールは、絶対位置を使用して解釈されます。詳細については、間接マルチタッチ ポインタ ジェスチャーをご覧ください。

入力デバイスのタッチ スクリーン、タッチパッド、ポインタ デバイスへの分類には、次のルールが適用されます。

  • touch.deviceType プロパティが設定されている場合、デバイスの種類はその設定に従います。
  • EVIOCGPROP ioctl を通じて、入力デバイスが INPUT_PROP_DIRECT 入力プロパティがあることをレポートすると、デバイスの種類はタッチ スクリーンに設定されます。この条件は、ディスプレイが接続されており、そのディスプレイに直接入力タッチデバイスが接続されていることを前提としています。
  • EVIOCGPROP ioctl を通じて、入力デバイスが INPUT_PROP_POINTER 入力プロパティがあることをレポートすると、デバイスの種類はポインタに設定されます。
  • 入力デバイスが REL_X または REL_Y 相対軸があることをレポートすると、デバイスの種類はタッチパッドに設定されます。この条件により、マウスとタッチパッドの両方で構成される入力デバイスのあいまいさが解消されます。この場合は、マウスがすでにポインタを制御しているため、タッチパッドはポインタの操作には使用されません。
  • 上記以外の場合は、デバイスの種類はポインタに設定されます。このデフォルト設定により、他の特別な用途を割り当てられていないタッチパッドが、確実にポインタの制御に使用されます。

ボタン

ボタンはアプリが追加の機能を実行するために使用できる任意のコントロールです。タッチデバイスのボタンはマウスボタンと同様に動作し、主にポインタタイプのタッチデバイスやタッチペンと組み合わせて使用されます。

次のボタンがサポートされています。

  • BTN_LEFT: MotionEvent.BUTTON_PRIMARY にマッピングされます。
  • BTN_RIGHT: MotionEvent.BUTTON_SECONDARY にマッピングされます。
  • BTN_MIDDLE: MotionEvent.BUTTON_MIDDLE にマッピングされます。
  • BTN_BACKBTN_SIDE: MotionEvent.BUTTON_BACK にマッピングされます。このボタンを押すと、キーコード KeyEvent.KEYCODE_BACK を使用してキーの入力が合成されます。
  • BTN_FORWARDBTN_EXTRA: MotionEvent.BUTTON_FORWARD にマッピングされます。このボタンを押すと、キーコード KeyEvent.KEYCODE_FORWARD を使用してキーの入力が合成されます。
  • BTN_STYLUS: MotionEvent.BUTTON_SECONDARY にマッピングされます。
  • BTN_STYLUS2: MotionEvent.BUTTON_TERTIARY にマッピングされます。

ツールとツールの種類

ツールとは、タッチデバイスの操作に使用する指、タッチペン、その他のデバイスを指します。一部のタッチデバイスでは、ツールのタイプを区別できます。

MotionEvent API などの Android の他の分野では、ツールがポインタと呼ばれる場合があります。

次のツールタイプがサポートされています。

  • BTN_TOOL_FINGERMT_TOOL_FINGER: MotionEvent.TOOL_TYPE_FINGER にマッピングされます。
  • BTN_TOOL_PENMT_TOOL_PEN: MotionEvent.TOOL_TYPE_STYLUS にマッピングされます。
  • BTN_TOOL_RUBBER: MotionEvent.TOOL_TYPE_ERASER にマッピングされます。
  • BTN_TOOL_BRUSH: MotionEvent.TOOL_TYPE_STYLUS にマッピングされます。
  • BTN_TOOL_PENCIL: MotionEvent.TOOL_TYPE_STYLUS にマッピングされます。
  • BTN_TOOL_AIRBRUSH: MotionEvent.TOOL_TYPE_STYLUS にマッピングされます。
  • BTN_TOOL_MOUSE: MotionEvent.TOOL_TYPE_MOUSE にマッピングされます。
  • BTN_TOOL_LENS: MotionEvent.TOOL_TYPE_MOUSE にマッピングされます。
  • BTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP: MotionEvent.TOOL_TYPE_FINGER にマッピングされます。

ホバーツールとタッチツール

ツールはタッチデバイスに接触させるか、タッチデバイスのすぐ上で少し隙間を空けて使用します。ツールをタッチデバイスの上で接触させずに使う場合、すべてのタッチデバイスでツールを感知できるわけではありません。RF ベースのタッチペン デジタイザーなどのタッチデバイスでは、通常は、デジタイザーの上の限られた範囲内にあるツールを検出します。

InputReader コンポーネントは、タッチツールとホバーツールを厳密に区別します。同様に、タッチツールとホバーツールはさまざまな方法でアプリにレポートされます。

タッチツールは、MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_DOWNMotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP により、タッチイベントとしてアプリにレポートされます。

ホバーツールは、MotionEvent.ACTION_HOVER_ENTERMotionEvent.ACTION_HOVER_MOVEMotionEvent.ACTION_HOVER_EXIT により、汎用モーション イベントとしてアプリにレポートされます。

タッチデバイス ドライバの要件

  • タッチデバイス ドライバでは、軸、軸のキーコード、サポートされるボタンのみを登録するようにします。サポートされていない軸またはキーコードを登録すると、デバイス分類アルゴリズムの処理が妨げられたり、システムがデバイスの機能を正しく検出できなくなったりします。たとえば、デバイスが BTN_TOUCH キーコードをレポートする場合、BTN_TOUCH は常にツールが画面に接触していることを示すものとして、システムに認識されます。そのため、ツールが画面に接触しておらず一定の範囲内にあることを示すために、BTN_TOUCH を使用するのは適切ではありません。
  • シングルタッチ デバイスでは、次の Linux 入力イベントを使用します。
    • ABS_X:(必須)ツールの X 座標をレポートします。
    • ABS_Y:(必須)ツールの Y 座標をレポートします。
    • ABS_PRESSURE:(任意)ツールの先端に加えられた物理的な圧力またはタッチ接触点の信号強度をレポートします。
    • ABS_TOOL_WIDTH:(任意)タッチ接触点またはツール自体の断面積または幅をレポートします。
    • ABS_DISTANCE:(任意)タッチデバイスの表面からツールまでの距離をレポートします。
    • ABS_TILT_X:(任意) X 軸に沿ったタッチデバイスの表面からのツールの傾きをレポートします。
    • ABS_TILT_Y:(任意) Y 軸に沿ったタッチデバイスの表面からのツールの傾きをレポートします。
    • BTN_TOUCH:(必須)ツールがデバイスに接触しているかどうかを示します。
    • BTN_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2:(任意)ボタンの状態をレポートします。
    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENSBTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:(任意)ツールタイプをレポートします。
  • マルチタッチ デバイスでは、次の Linux 入力イベントを使用します。
    • ABS_MT_POSITION_X:(必須)ツールの X 座標をレポートします。
    • ABS_MT_POSITION_Y:(必須)ツールの Y 座標をレポートします。
    • ABS_MT_PRESSURE:(任意)ツールの先端に加えられた物理的な圧力またはタッチ接触点の信号強度をレポートします。
    • ABS_MT_TOUCH_MAJOR:(任意)タッチ接触点の断面積、またはタッチ接触点の長辺の長さをレポートします。
    • ABS_MT_TOUCH_MINOR:(任意)タッチ接触点の短辺の長さをレポートします。ABS_MT_TOUCH_MAJOR が面積の測定値をレポートしている場合、この軸は使用しないでください。
    • ABS_MT_WIDTH_MAJOR:(任意)ツール自体の断面積、またはツール自体の長辺の長さをレポートします。ツール自体の寸法を把握していない場合、この軸は使用しないでください。
    • ABS_MT_WIDTH_MINOR:(任意)ツール自体の短辺の長さをレポートします。ABS_MT_WIDTH_MAJOR が面積の測定値をレポートしている場合、またはツール自体の寸法が不明な場合、この軸は使用しないでください。
    • ABS_MT_ORIENTATION:(任意)ツールの向きをレポートします。
    • ABS_MT_DISTANCE:(任意)タッチデバイスの表面からツールまでの距離をレポートします。
    • ABS_MT_TOOL_TYPE:(任意)ツールタイプMT_TOOL_FINGER または MT_TOOL_PEN としてレポートします。
    • ABS_MT_TRACKING_ID:(任意)ツールのトラッキング ID をレポートします。トラッキング ID は任意の正の整数であり、複数のツールが同時にアクティブなときに、各ツールを個別に識別してトラッキングするために使用されます。たとえば、複数の指が同時にデバイスに接触している場合、指が接触している間、それぞれの指を識別するトラッキング ID が指ごとに個別に割り当てられます。関連付けられたツールが範囲外に移動した場合、トラッキング ID は再利用される場合があります。
    • ABS_MT_SLOT:(任意) Linux のマルチタッチ プロトコル「タイプ B」を使用している場合、ツールのスロット ID をレポートします。詳細については、Linux のマルチタッチ プロトコルのドキュメントをご覧ください。
    • BTN_TOUCH:(必須)ツールがデバイスに接触しているかどうかを示します。
    • BTN_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2:(任意)ボタンの状態をレポートします。
    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENSBTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:(任意)ツールタイプをレポートします。
  • シングルタッチ プロトコル用の軸とマルチタッチ プロトコル用の軸の両方が定義されている場合、マルチタッチ軸のみが使用され、シングルタッチ軸は無視されます。
  • ABS_XABS_YABS_MT_POSITION_XABS_MT_POSITION_Y 軸の最小値と最大値は、デバイスで有効な領域の境界を定義するもので、デバイス固有の表面単位を使用します。タッチ スクリーンの場合、有効な領域は実際にディスプレイを覆っているタッチデバイスの部分になります。

    システムによって、表面単位でレポートされた接触位置が自動的に補間され、次の計算式によってディスプレイのピクセル表示による接触位置に変換されます。

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    タッチ スクリーンは、レポートされた有効領域以外での接触をレポートすることがあります。

    有効領域外で開始された接触は、アプリには渡されず、仮想キーに使用されます。

    有効領域内で開始された接触、またはディスプレイ領域を出入りする接触は、アプリに渡されます。つまり、アプリの境界内で接触が開始され有効領域外に移動すると、アプリにはディスプレイの座標が負の値になったタッチイベント、または座標がディスプレイの境界を超えるタッチイベントが渡されます。これは仕様の範囲内です。

    タッチデバイスでは、有効領域の境界に接触時の座標を固定しません。接触位置が有効領域の外側に移動する場合は、有効領域外にあるとレポートするか、なにもレポートしないようにします。

    たとえば、ユーザーの指がタッチ スクリーンの左上の角の付近に接触している場合、座標(minX、minY)がレポートされます。その後、指が有効領域の外側に移動していく場合は、タッチ スクリーンは minX と minY より小さい要素(minX-2、minY-3 など)の座標をレポートするか、接触位置のレポートを停止するようにします。つまり、ユーザーの指が有効領域の外側に接触している場合には、タッチ スクリーンが minX、minY をレポートしないようにする必要があります。

    接触位置の座標をディスプレイの端に固定すると、画面の端に人為的なハード境界が作成されることになり、ディスプレイ領域の境界を出入りする動きがスムーズにトラッキングできなくなります。

  • ABS_PRESSURE または ABS_MT_PRESSURE によってレポートされる値は、ツールがデバイスに接触しているときは 0 でなければなりません(値がすべてレポートされる場合)。0 でない場合は、ツールが接触していないが範囲内にあることを意味します。

    圧力情報のレポートは任意ですが、強く推奨されます。圧力情報を使用して、アプリによる感圧式描画などの効果が実装可能になります。

  • ABS_TOOL_WIDTHABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINORABS_MT_WIDTH_MAJORABS_MT_WIDTH_MINOR によってレポートされる値は、ツールがデバイスに接触しているときは 0 以外でなければなりません。デバイスに接触していない場合が 0 になりますが、必ず 0 にする必要はありません。たとえば、タッチデバイスは指による接触点のサイズを測定できますが、タッチペンによる接触点のサイズは測定できない場合があります。

    サイズ情報のレポートは任意ですが、強く推奨されます。サイズ情報を使用して、アプリによるサイズ感知式描画などの効果が実装可能になります。

  • ABS_DISTANCE または ABS_MT_DISTANCE によってレポートされる値は、ツールがデバイスに接触しているときに 0 に近い値になります。距離の値は、ツールが直接接触していても、0 以外の値になることがあります。正確な値はハードウェアが距離を測定する方法によって異なります。

    距離情報のレポートは任意ですが、タッチペン デバイスの場合には推奨されます。

  • ABS_TILT_XABS_TILT_Y によって報告される値は、ツールがデバイスに対して垂直の場合、0 になります。0 以外の傾斜の場合は、ツールが傾いていることを示します。

    X 軸と Y 軸に沿った傾斜角度は、垂直からの角度で測定されます。中心点(完全に垂直)は、軸ごとに (max + min) / 2 で求められます。値が中心点より小さい場合は上または左に傾斜していることを示し、中心点より大きい場合は下または右に傾斜していることを示します。

    InputReader は、X と Y の傾斜成分を 0~PI / 2 ラジアンの範囲の垂直傾斜角と -PIPI ラジアンの範囲の平面方位角に変換します。この表現により、指が接触したときの傾斜や方位を、互換性を備えた方位として扱うことが可能となります。

    傾斜情報のレポートは任意ですが、タッチペン デバイスの場合には推奨されます。

  • ABS_MT_TOOL_TYPE でレポートされるツールタイプは、BTN_TOOL_* でレポートされるツールタイプ情報をすべて置き換えます。ツールタイプ情報がまったくレポートされない場合は、ツールタイプはデフォルトで MotionEvent.TOOL_TYPE_FINGER になります。

  • ツールが有効かどうかの判別は、次の条件に基づいて行われます。

    • シングルタッチ プロトコルを使用している場合、BTN_TOUCH または BTN_TOOL_* が 1 であれば、ツールは有効です。

      この条件は、InputReader にツールの性質に関する情報(ツールの接触状態やツールタイプなど)が必要なことを示しています。利用できる情報がない場合は、ツールが無効(範囲外)であるとみなされます。

    • マルチタッチ プロトコル「タイプ A」を使用する場合、最新の同期レポートに表示されていれば、常にツールは有効です。同期レポートに表示されなくなると、ツールは停止して終了します。
    • マルチタッチ プロトコル「タイプ B」を使用する場合、有効なスロットがある限り、ツールは有効です。スロットがクリアされると、ツールは停止して終了します。
  • ツールは、次の条件に基づいて範囲内にあると判別されます。
    • ツールが BTN_TOOL_MOUSE または BTN_TOOL_LENS である場合、次のいずれかの条件が true であっても、ツールは範囲内にはないとみなされます。
    • ツールが有効で、ドライバが圧力情報をレポートし、レポートされた圧力が 0 の場合、ツールは範囲内にあるとみなされます。
    • ツールが有効で、ドライバが BTN_TOUCH キーコードに対応しており、BTN_TOUCH の値が 0 の場合、ツールは範囲内にあるとみなされます。
  • InputReader は、マルチタッチ プロトコル「タイプ A」と「タイプ B」の両方に対応しています。新しいドライバは「タイプ B」プロトコルを使用する必要がありますが、どちらのプロトコルでも正常に動作します。
  • Android 4.0 以降、タッチ スクリーン ドライバは Linux の入力プロトコル仕様に準拠するように、変更しなければならない場合があります。

    次のような変更が求められる場合があります。

    • ツールが無効になった場合(指が範囲外に外れた場合)は、後に続くマルチタッチ同期レポートへの表示を停止する。すべてのツールが無効になった場合(すべての指が範囲外に外れた場合)は、ドライバから空の同期レポート パケットを送信する(SYN_MT_REPORT に続いて SYN_REPORT を送信する)。

      Android の以前のバージョンでは、0 の圧力値が送信されると「アップ」イベントが報告されていましたが、この以前の動作は Linux 入力プロトコルの仕様と互換性がなく、サポートされなくなりました。

    • 物理的な圧力や信号強度の情報は、ABS_MT_PRESSURE を使用して報告する。

      以前のバージョンの Android では、圧力情報は ABS_MT_TOUCH_MAJOR から取得されていました。この以前の動作は Linux 入力プロトコルの仕様と互換性がなく、サポートされなくなりました。

    • タッチサイズ情報は、ABS_MT_TOUCH_MAJOR を使用して報告する。

      以前のバージョンの Android では、サイズ情報は ABS_MT_TOOL_MAJOR から取得されていました。この以前の動作は Linux 入力プロトコルの仕様と互換性がなく、サポートされなくなりました。

    タッチデバイス ドライバに対しては、Android 固有のカスタマイズが不要になりました。標準の Linux 入力プロトコルを利用することで、Android のドライバを変更することなく、外部 HID マルチタッチ スクリーンなどの多様なタッチ周辺機器をサポートできます。

タッチデバイスの操作

以下では、Android でのタッチデバイスの操作の概要を説明します。

  1. EventHub により、evdev ドライバから未加工のイベントデータが読み取られます。
  2. InputReader が未加工のイベントデータを使用し、各ツールの位置やその他の特性に関する内部状態を更新します。また、ボタンの状態も追跡します。
  3. 戻るまたは進むが押されるか、離された場合、InputReaderInputDispatcher にキーイベントを通知します。
  4. InputReader は仮想キーが押されたかどうかを判別し、押された場合には InputDispatcher にキーイベントを通知します。
  5. InputReader は接触がディスプレイの境界内で開始されたかどうかを判別します。境界内で開始された場合は InputDispatcher にタッチイベントを通知します。
  6. 接触しているツールがなく、範囲内にあるツールが 1 つ以上ある場合は、InputReaderInputDispatcher にホバーイベントを通知します。
  7. タッチデバイス タイプがポインタである場合、InputReader はポインタ ジェスチャー検出を行い、結果に応じてポインタとスポットを移動し、InputDispatcher にポインタ イベントを通知します。
  8. InputDispatcherWindowManagerPolicy を使用して、イベントをディスパッチするか、デバイスのスリープを解除するかを判断します。そして、InputDispatcher はイベントを適切なアプリに渡します。

タッチデバイスの設定

タッチデバイスの動作は、デバイスの軸、ボタン、入力プロパティ、入力デバイス設定、仮想キーマップ、キーレイアウトによって決まります。

キーボードの構成に関係するファイルの詳細については、以下のセクションを参照してください。

プロパティ

システムは、タッチデバイスの動作の設定と調整を行う際に、複数の入力デバイス設定プロパティを使用します。

複数のプロパティが使われるのは、タッチデバイスのデバイス ドライバが接触の状態についてレポートする際、デバイスに固有の単位が使われることが多いためです。

たとえば、多くのタッチデバイスでは、接触点の面積を測定する際に、接触によってトリガーされたセンサーノードの総数などの内部デバイス固有のスケールを使用します。この場合のサイズ値は、未加工のままではアプリにとって有意なデータとはなりません。有意なものとするには、アプリ側でタッチデバイス センサーノードの物理サイズやその他の特性を把握する必要があります。

システムは入力デバイス設定ファイルのエンコードされた調整パラメータを使用して、タッチデバイスからレポートされた値をデコード、変換、正規化し、アプリ側での解釈が可能なシンプルな標準表現にします。

ドキュメントの表記規則

このドキュメントでは、システムによる調整処理の際に使用される値について、次の規則に従って表記します。

未加工の軸の値

次の式は、タッチデバイス ドライバによって、EV_ABS イベントとしてレポートされる未加工の値を表します。

raw.x
ABS_X 軸、または ABS_MT_POSITION_X 軸の値。
raw.y
ABS_Y 軸、または ABS_MT_POSITION_Y 軸の値。
raw.pressure
ABS_PRESSURE 軸、または ABS_MT_PRESSURE 軸の値。検出されない場合は 0。
raw.touchMajor
ABS_MT_TOUCH_MAJOR 軸の値。検出されない場合は 0。
raw.touchMinor
ABS_MT_TOUCH_MINOR 軸の値。検出されない場合は raw.touchMajor
raw.toolMajor
ABS_TOOL_WIDTH 軸、または ABS_MT_WIDTH_MAJOR 軸の値。検出されない場合は 0。
raw.toolMinor
ABS_MT_WIDTH_MINOR 軸の値。検出されない場合は raw.toolMajor
raw.orientation
ABS_MT_ORIENTATION 軸の値。検出されない場合は 0。
raw.distance
ABS_DISTANCE 軸、または ABS_MT_DISTANCE 軸の値。検出されない場合は 0。
raw.tiltX
ABS_TILT_X 軸の値。検出されない場合は 0。
raw.tiltY
ABS_TILT_Y 軸の値。検出されない場合は 0。

未加工の軸の範囲

次の式は、未加工の値の境界を表します。軸ごとに EVIOCGABS ioctl を呼び出して取得します。

raw.*.min
未加工の軸の最小値(両端を含む)。
raw.*.max
未加工の軸の最大値(両端を含む)。
raw.*.range
raw.*.max - raw.*.min と同等。
raw.*.fuzz
未加工の軸の精度。たとえば、fuzz = 1 は値が +/- 1 の単位で正確であることを意味します。
raw.width
タッチ領域の幅(両端を含む)。raw.x.range + 1 と同等。
raw.height
タッチ領域の高さ(両端を含む)。raw.y.range + 1 と同等。

出力範囲

次の式は、出力座標系の特性を表します。システムは線形補間を使用して、タッチデバイスが使用する表面単位の接触位置情報を、アプリにレポートされる出力単位(ディスプレイ ピクセルなど)に変換します。

output.width
出力の幅。ディスプレイに関連付けられたタッチ スクリーンの場合、幅の表示はピクセル単位になります。ディスプレイに関連付けられていないタッチパッドの場合は、出力の幅は raw.width と等しくなり、補間は行われません。
output.height
出力の高さ。ディスプレイに関連付けられたタッチ スクリーンの場合、高さの表示はピクセル単位になります。ディスプレイに関連付けられていないタッチパッドの場合は、出力の高さは raw.height と等しくなり、補間は行われません。
output.diag
出力座標系の対角線の長さ。sqrt(output.width ^2 + output.height ^2) と同等。

基本設定

タッチ入力マッパーでは、調整値の指定の際に、入力デバイス設定ファイルの複数の設定プロパティが使用されます。次の表に、汎用的な設定プロパティの一部を示します。他のプロパティについては、調整に使用するフィールドと合わせて以下のセクションで説明します。

touch.deviceType

定義: touch.deviceType = touchScreen | touchPad | pointer | default

タッチデバイス タイプを指定します。

  • 値が touchScreen の場合は、ディスプレイに関連付けられたタッチ スクリーンがタッチデバイスになります。

  • 値が touchPad の場合は、ディスプレイに関連付けられていないタッチパッドがタッチデバイスになります。

  • 値が pointer の場合は、ディスプレイに関連付けられていないタッチパッドがタッチデバイスになり、モーションが間接マルチタッチ ポインタ ジェスチャーに使用されます。

  • 値が default の場合は、システムが分類アルゴリズムに従ってデバイスタイプを自動的に検出します。

デバイスタイプがタッチデバイスの動作に与える影響について詳しくは、分類のセクションをご覧ください。

Android 3 以前では、すべてのタッチデバイスがタッチ スクリーンとみなされていました。

touch.orientationAware

定義: touch.orientationAware = 0 | 1

タッチデバイスをディスプレイの向きの変化に対応させるかどうか指定します。

  • 値が 1 の場合、ディスプレイの向きが変化するたびに、ディスプレイ デバイスのレポートする接触位置が回転します。

  • 値が 0 の場合、ディスプレイの向きが変化しても、タッチデバイスのレポートする接触位置は影響を受けません。

デフォルト値は、デバイスがタッチ スクリーンの場合は 1、それ以外の場合は 0 です。

システムは、内部および外部タッチ スクリーンとディスプレイを区別します。内部ディスプレイの向きに応じて、内部タッチ スクリーンが向きを認識して回転します。外部ディスプレイの向きに応じて、外部タッチ スクリーンが向きを認識して回転します。

画面の向きの認識は、Nexus One などのデバイスでのタッチ スクリーンの回転をサポートするために使用されます。たとえば、デバイスを自然な向きから時計回りに 90 度回転させると、接触位置の絶対座標が再マッピングされ、タッチ スクリーンの絶対座標系の左上隅の接触位置が、ディスプレイ座標系の左上隅の接触位置としてレポートされます。このようにすることで、アプリが視覚要素を描画する際に使用する座標系で接触位置をレポートできます。

Honeycomb より前のバージョンでは、すべてのタッチデバイスが向きを認識しているとみなされていました。

touch.gestureMode

定義: touch.gestureMode = pointer | spots | default

ポインタ ジェスチャーの表示モードを指定します。この設定プロパティは、タッチデバイスのタイプがポインタの場合にのみ使用できます。

  • 値が pointer の場合、タッチパッド ジェスチャーは、マウスポインタに類似したカーソルによって表示されます。

  • 値が spots の場合、タッチパッドのジェスチャーは、ジェスチャーの中心を表すアンカーと、個々の指の位置を表す円形の点で表されます。

INPUT_PROP_SEMI_MT 入力プロパティが設定されている場合、デフォルト値は pointer になります。設定されていない場合は spots になります。

X フィールドと Y フィールド

X フィールドと Y フィールドは、接触領域の中央を示す位置情報を提供します。

計算

計算は難しいものではありません。タッチドライバからの位置情報は出力座標系に線形補間されます。

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor、touchMinor、toolMajor、toolMinor、size フィールド

touchMajor フィールドと touchMinor フィールドでは、接触領域のおおよその寸法が出力単位(ピクセル)で示されます。

toolMajor フィールドと toolMinor フィールドでは、ツール自体のおおよその寸法が出力単位(ピクセル)で示されます。

size フィールドでは、タッチデバイスが感知できる最大の接触サイズに合わせて正規化された接触サイズが示されます。正規化が可能な最小サイズは 0.0 です(接触がない、または測定不能)。正規化が可能な最大サイズは 1.0 です(センサー領域が飽和)。

近似の長さと幅の両方が測定可能な場合は、touchMajor フィールドが接触領域の長辺を示し、touchMinor フィールドが接触領域の短辺を示します。測定できるのが接触領域のおおよその直径のみである場合は、touchMajor フィールドと touchMinor フィールドが等しくなります。

同様に、toolMajor フィールドはツールの断面積の長辺を示し、toolMinor フィールドはツールの断面積の短辺を示します。

タッチサイズは測定できないものの、ツールサイズが測定できる場合、ツールサイズはタッチサイズと等しく設定されます。逆に、ツールサイズは測定できないがタッチサイズが測定できる場合、タッチサイズはツールサイズと等しく設定されます。

タッチデバイスは、さまざまな方法でタッチサイズとツールサイズを測定またはレポートします。現在の実装では、直径、面積、表面単位のジオメトリ境界ボックスの 3 種類の測定をサポートしています。

定義: touch.size.calibration = none | geometric | diameter | area | default

タッチドライバによって使用される測定の種類を指定し、タッチサイズとツールサイズをレポートします。

  • 値が none の場合、サイズは 0 に設定されます。

  • 値が geometric の場合、サイズは位置と同じ表面単位で指定されるものとみなされ、同じ方法でスケーリングされます。

  • 値が diameter の場合、サイズは接触面またはツールの直径(幅)に比例するとみなされます。

  • 値が area の場合、サイズは接触面またはツールの面積に比例するとみなされます。

  • 値が default の場合、raw.touchMajor 軸または raw.toolMajor 軸が利用可能であれば、システムは geometric 調整を使用します。それ以外の場合は、none 調整を使用します。

touch.size.scale

定義: touch.size.scale = <負でない浮動小数点数>

調整で使用する一定のスケール係数を指定します。

デフォルト値は 1.0 です。

touch.size.bias

定義: touch.size.bias = <負でない浮動小数点数>

調整で使用する一定のバイアス値を指定します。

デフォルト値は 0.0 です。

touch.size.isSummed

定義: touch.size.isSummed = 0 | 1

サイズを、有効なすべての接触点のサイズの合計としてレポートするか、接触点ごとに個別にレポートするかを指定します。

  • 値が 1 の場合、レポートされたサイズは使用する前に接触点の数で除算されます。

  • 値が 0 の場合、レポートされたサイズはそのまま使用されます。

デフォルト値は 0 です。

一部のタッチデバイス、特に「Semi-MT」デバイスでは、複数の接触点の個々のサイズが区別できないため、合計面積や合計幅を表すサイズ測定値がレポートされます。そのようなデバイスの場合、このプロパティは 1 にのみ設定できます。確かでない場合は、この値を 0 に設定します。

計算

touchMajortouchMinortoolMajortoolMinorsize フィールドの計算は、指定された調整パラメータによって異なります。

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

pressure フィールド

pressure フィールドでは、タッチデバイスに適用されるおおよその物理圧力が、0.0(タッチなし)~1.0(通常の圧力)の間で正規化された値として示されます。

圧力が 0 の場合は、ツールが範囲内にあることを示します。

touch.pressure.calibration

定義: touch.pressure.calibration = none | physical | amplitude | default

タッチドライバが圧力をレポートするために使用する測定方法を指定します。

  • 値が none の場合、圧力は不明であることから、接触があると 1.0 に、範囲内にツールがある場合には 0.0 に設定されます。

  • 値が physical の場合、タッチパッドに加えられる実際の物理的強度が、圧力軸で測定されるものとみなされます。

  • 値が amplitude の場合、接触点のサイズと加えられる圧力に関連する信号の振幅が、圧力軸で測定されるものとみなされます。

  • 値が default の場合、圧力軸が利用可能であれば、システムは physical による調整を使用し、それ以外の場合には none を使用します。

touch.pressure.scale

定義: touch.pressure.scale = <負でない浮動小数点数>

調整で使用する一定のスケール係数を指定します。

デフォルト値は 1.0 / raw.pressure.max です。

計算

pressure フィールドの計算は、指定された調整パラメータによって異なります。

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

orientation フィールドと tilt フィールド

orientation フィールドは、角度測定による接触とツールの向きを示します。0 は主軸が縦向き、-PI/2 は主軸が左向き、PI/2 は主軸が右向きであることを示します。タッチペン ツールの場合は、向きの範囲が -PI または PI からの 1 つの円の範囲で示されます。

tilt フィールドは、角度測定によるツールの傾きを示します。傾きが 0 の場合は、ツールが表面に対して垂直であることを示します。傾きが PI/2 の場合は、ツールが表面に対してフラットであることを示します。

touch.orientation.calibration

定義: touch.orientation.calibration = none | interpolated | vector | default

タッチドライバが向きをレポートするために使用する測定の種類を指定します。

  • 値が none の場合、向きが不明であることから 0 に設定されます。
  • 値が interpolated の場合は、向きが線形補間されます。raw.orientation.min の未加工の値が -PI/2 にマッピングされ、raw.orientation.max の未加工の値が PI/2 にマッピングされます。(raw.orientation.min + raw.orientation.max) / 2 の中央値は 0 にマッピングされます。
  • 値が vector の場合は、2 つの符号付き 4 ビット フィールドにまとめられたベクトルとして解釈されます。この表現は Atmel のオブジェクト ベース プロトコルの部分で使用されます。ベクトルをデコードすると、方位角と信頼度が生成され、ジオメトリでない場合には、信頼度がサイズ情報のスケーリングに使用されます。
  • 値が default の場合、方向軸が利用可能であれば、システムにより interpolated 調整が使用され、それ以外の場合は none が使用されます。

計算

orientation フィールドと tilt フィールドの計算は、指定された調整パラメータと利用可能な入力値によって異なります。

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

distance フィールド

distance フィールドは、ツールとタッチデバイスの表面との間の距離を表します。値が 0.0 の場合は直接接触していることを示し、値が大きくなるほど表面からの距離が離れます。

touch.distance.calibration

定義: touch.distance.calibration = none | scaled | default

タッチドライバが距離をレポートする際に使用する測定の種類を指定します。

  • 値が none の場合、距離が不明なことから 0 に設定されます。

  • 値が scaled の場合は、レポートされた距離が一定のスケール係数で乗算されます。

  • 値が default の場合は、距離の軸が使用可能であれば、システムにより scaled 調整が使用され、それ以外の場合は none が使用されます。

touch.distance.scale

定義: touch.distance.scale = <負でない浮動小数点数>

調整で使用する一定のスケール係数を指定します。

デフォルト値は 1.0 です。

計算

distance フィールドの計算は、指定された調整パラメータによって異なります。

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

互換性に関する注意事項

Android Ice Cream Sandwich 4.0 では、タッチデバイスの設定プロパティが大幅に変更されました。新しい設定プロパティを使用するには、タッチデバイスの入力デバイス設定ファイルをすべて更新する必要があります。

古いタッチデバイス ドライバも更新する必要があります。

仮想キーマップ ファイル

タッチデバイスは仮想キーの実装に使用されます。

実装には、タッチ コントローラの機能に応じて、いくつかの方法があります。一部のタッチ コントローラでは、ファームウェア レジスタを設定することで、ソフトキーの実装を直接構成できます。ソフトウェア内のキーコードへタッチ座標からマッピングするのが望ましい場合もあります。

仮想キーがソフトウェアで実装されている場合、カーネルで virtualkeys.<devicename> という仮想キーマップ ファイルをボード プロパティとしてエクスポートする必要があります。たとえば、タッチ スクリーン デバイス ドライバのレポートする名前が「touchyfeely」である場合、仮想キーマップ ファイルのパスは /sys/board_properties/virtualkeys.touchyfeely になります。

仮想キーマップ ファイルでは、タッチ スクリーン上の仮想キーの座標と Linux キーコードが示されます。

また、仮想キーマップ ファイルに加えて、対応するキーレイアウト ファイルとキー文字マップファイルが必要です。Linux キーコードを Android キーコードにマッピングし、キーボード デバイスのタイプ(通常は SPECIAL_FUNCTION)を指定します。

構文

仮想キーマップ ファイルは、改行またはコロンで区切られた仮想キーレイアウトの記述に沿って構成される書式なしテキスト ファイルです。

コメント行は「#」で始まり、行末まで続きます。

それぞれの仮想キーは、コロンで区切られた 6 つのコンポーネントで記述されます。

  • 0x01: バージョン コード。常に 0x01 になります。
  • <Linux key code>: 仮想キーの Linux キーコード。
  • <centerX>: 仮想キーの中心の X 座標(ピクセル単位)。
  • <centerY>: 仮想キーの中心の Y 座標(ピクセル単位)。
  • <width>: 仮想キーの幅(ピクセル単位)。
  • <height>: 仮想キーの高さ(ピクセル単位)。

すべての座標とサイズは、ディスプレイの座標系で指定します。

仮想キーマップ ファイルをすべて 1 行で記述すると、次のようになります。

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

同じ仮想キーマップ ファイルを複数の行で記述することもできます。

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

上記の例では、タッチ スクリーンの解像度は 480x800 です。したがって、すべての仮想キーの <centerY> 座標は 835 になり、タッチ スクリーンの可視領域の少し下になります。

最初のキーの Linux スキャンコードは 158KEY_BACK)、centerX は 55、centerY は 835、幅は 90、高さは 55 です。

仮想キーマップ ファイル: /sys/board_properties/virtualkeys.touchyfeely

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

キーレイアウト ファイル: /system/usr/keylayout/touchyfeely.kl

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

キー文字マップファイル: /system/usr/keychars/touchyfeely.kcm

type SPECIAL_FUNCTION

間接マルチタッチ ポインタ ジェスチャー

ポインタモードでは、システムは次のジェスチャーを解釈できます。

  • 1 本指でタップする: クリックする。
  • 1 本指で動かす: ポインタを動かす。
  • 1 本指で動かしてボタンを押す: ポインタをドラッグする。
  • 2 本指を同時に同じ方向に動かす: ポインタの下の領域をその方向にドラッグする。ポインタ自体は動きません。
  • 2 本の指を互いに向けて動かすか、互いから離れるように動かす: ポインタを囲む領域をパン/スケール/回転させる。ポインタ自体は動きません。
  • 複数の指で動かす: フリーフォームのジェスチャー。

パーム リジェクション

Android 13 以降では、組み込みフレームワークが有効になっている場合、システムは手のひらからの入力を自動的に拒否できます。自社製のカスタム ソリューションは引き続きサポートされますが、手のひらが検出されたときに TOOL_TYPE_PALM フラグを返すように変更しなければならない場合があります。また、組み込みフレームワークはカスタム ソリューションと連携して動作します。

実際のモデルは、最初の 90 ミリ秒のジェスチャー データ、現在のポインタ、周囲のポインタを確認したうえで、接触点がディスプレイの端からどれくらい離れているかを考慮します。次に、ポインタごとにどのポインタが手のひらであるかを判定します。また、touchMajortouchMinor で報告される各接触点のサイズも考慮します。次いで、Android フレームワークは、手のひらとしてマークされたポインタをタッチ ストリームから削除します。

ポインタがすでにアプリに送信されている場合、システムは以下のいずれかを行います。

  • (他のアクティブなポインタがある場合)ACTION_POINTER_UPFLAG_CANCELED が設定されているポインタをキャンセルします。
  • (他にポインタがない場合)ACTION_CANCEL が設定されているポインタをキャンセルします。

公開 API である MotionEvent.FLAG_CANCELED は、現在のイベントがユーザー アクションをトリガーしないことを指定します。このフラグは ACTION_CANCELACTION_POINTER_UP の両方で設定されます。

手のひらポインタがアプリに送信されていない場合、システムは単にポインタをドロップします。

パーム リジェクションを有効にする

  1. タッチドライバで、input_abs_set_res マクロを使用して以下のフィールドの解像度を設定します(単位は mm あたりのピクセルです):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    ABS_MT_TOUCH_MINOR のサポートは任意です。ただし、デバイスでサポートされている場合は、解像度が正しく設定されていることを確認してください。

  2. フィールドが正しく設定されていることを確認するには、次のコマンドを実行します。
        $ adb shell getevent -li
    
  3. 実行時にこの機能を有効にするには、次のコマンドを実行します。
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. system_server プロセスを再起動します。
         $ adb shell stop && adb shell start
        
  5. adb shell dumpsys input を参照して、UnwantedInteractionBlocker 内にパーム リジェクタが存在することを確認します。存在しない場合は、入力関連のログを調べて、構成ミスを示す手がかりを探します。

    参考として次の例をご覧ください。

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. この機能を永続的に有効にするには、対応する sysprop コマンドを init**rc ファイルに追加します。

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

参考資料