タッチデバイス

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Android は、スタイラス ベースのデジタイザ タブレットを含む、さまざまなタッチ スクリーンとタッチ パッドをサポートしています。

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

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

タッチ デバイスには、マウスのボタンに似た機能を持つボタンがある場合があります。

タッチ デバイスは、基盤となるタッチ センサー テクノロジに応じて、指やスタイラスなどのさまざまなツールを使用して操作できる場合があります。

タッチ デバイスは、仮想キーの実装に使用されることがあります。たとえば、一部の Android デバイスでは、タッチ スクリーン センサー領域がディスプレイの端を超えて拡張され、タッチ センシティブ キー パッドの一部として 2 つの目的を果たします。

タッチ デバイスは多種多様であるため、Android は多数の構成プロパティに依存して、各デバイスの特性と目的の動作を記述します。

タッチ デバイスの分類

次の両方の条件が満たされる場合、入力デバイスはマルチタッチデバイスとして分類されます。

  • 入力デバイスは、 ABS_MT_POSITION_XおよびABS_MT_POSITION_Y絶対軸の存在を報告します。

  • 入力デバイスにはゲームパッド ボタンがありません。この状態は、MT 軸のコードと重複するコードを持つ軸を報告する特定のゲームパッドのあいまいさを解決します。

次の両方の条件が満たされる場合、入力デバイスはシングルタッチデバイスとして分類されます。

  • 入力デバイスは、マルチタッチ デバイスとして分類されません。入力デバイスは、シングルタッチ デバイスまたはマルチタッチ デバイスのいずれかに分類されますが、両方に分類されることはありません。

  • 入力デバイスは、 ABS_XおよびABS_Y絶対軸の存在、およびBTN_TOUCHキー コードの存在を報告します。

入力デバイスがタッチ デバイスとして分類されると、仮想キーの存在は、デバイスの仮想キー マップ ファイルの読み込みを試みることによって判断されます。仮想キー マップが利用可能な場合、デバイスのキー レイアウト ファイルも読み込まれます。

仮想キー マップ ファイルの場所と形式については、以下のセクションを参照してください。

次に、システムはタッチ デバイスの入力デバイス構成ファイルを読み込みます。

すべての内蔵タッチ デバイスには、入力デバイス構成ファイルが必要です。入力デバイス構成ファイルが存在しない場合、システムは、外部 USB または Bluetooth HID タッチ スクリーンやタッチ パッドなどの一般的な汎用タッチ周辺機器に適したデフォルト構成を選択します。これらの既定値は、組み込みのタッチ スクリーン用に設計されていないため、正しく動作しない可能性があります。

入力デバイス構成が読み込まれると、システムは入力デバイスをタッチ スクリーンタッチ パッド、またはポインターデバイスとして分類します。

  • タッチ スクリーンデバイスは、画面上のオブジェクトを直接操作するために使用されます。ユーザーは画面に直接触れているため、システムは操作中のオブジェクトを示すために追加のアフォーダンスを必要としません。

  • タッチ パッドデバイスは、特定のセンサー領域へのタッチに関する絶対位置情報をアプリケーションに提供するために使用されます。デジタイザ タブレットに役立つ場合があります。

  • ポインタデバイスは、カーソルを使用して画面上のオブジェクトを間接的に操作するために使用されます。指は、マルチタッチ ポインター ジェスチャとして解釈されます。スタイラスなどの他のツールは、絶対位置を使用して解釈されます。

    詳細については、間接マルチタッチ ポインター ジェスチャを参照してください。

次の規則は、入力デバイスをタッチ スクリーンタッチ パッド、またはポインターデバイスとして分類するために使用されます。

  • touch.deviceTypeプロパティが設定されている場合、デバイス タイプは示されているとおりに設定されます。

  • 入力デバイスが ( EVIOCGPROP ioctl を介して) INPUT_PROP_DIRECT入力プロパティの存在を報告する場合、デバイス タイプはtouch screenに設定されます。この条件は、直接入力タッチ デバイスが接続されているディスプレイに接続されていることを前提としています。

  • 入力デバイスが ( EVIOCGPROP ioctl を介して) INPUT_PROP_POINTER入力プロパティの存在を報告する場合、デバイス タイプはpointerに設定されます。

  • 入力デバイスがREL_XまたはREL_Y相対軸の存在を報告する場合、デバイス タイプはtouch padに設定されます。この条件は、マウスとタッチ パッドの両方で構成される入力デバイスのあいまいさを解決します。この場合、マウスがすでにポインターを制御しているため、ポインターの制御にタッチパッドは使用されません。

  • それ以外の場合、デバイス タイプはpointerに設定されます。このデフォルトにより、他の特別な目的が指定されていないタッチパッドがポインターの制御に使用されるようになります。

ボタン

ボタンは、アプリケーションが追加機能を実行するために使用できるオプションのコントロールです。タッチ デバイスのボタンは、マウス ボタンと同様に動作し、主にポインタータイプのタッチ デバイスまたはスタイラスで使用されます。

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

  • BTN_LEFT : MotionEvent.BUTTON_PRIMARYにマップされます。

  • BTN_RIGHT : MotionEvent.BUTTON_SECONDARYにマップされます。

  • BTN_MIDDLE : MotionEvent.BUTTON_MIDDLEにマップされます。

  • BTN_BACKおよびBTN_SIDE : MotionEvent.BUTTON_BACKにマップされます。このボタンを押すと、キー コードKeyEvent.KEYCODE_BACKを使用してキーの押下も合成されます。

  • BTN_FORWARDおよびBTN_EXTRA : MotionEvent.BUTTON_FORWARDにマップされます。このボタンを押すと、キー コードKeyEvent.KEYCODE_FORWARDを使用してキーの押下も合成されます。

  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARYにマップされます。

  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARYにマップされます。

ツールとツールの種類

ツールとは、タッチ デバイスを操作するために使用される指、スタイラス、またはその他の装置です。一部のタッチ デバイスは、さまざまな種類のツールを区別できます。

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

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

  • BTN_TOOL_FINGERおよびMT_TOOL_FINGER : MotionEvent.TOOL_TYPE_FINGERにマップされます。

  • BTN_TOOL_PENおよびMT_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_TRIPLETAP 、およびBTN_TOOL_QUADTAP : MotionEvent.TOOL_TYPE_FINGERにマップされます。

ホバリングとツールのタッチ

ツールは、タッチ デバイスと接触しているか、範囲内にあり、その上にホバリングしている可能性があります。すべてのタッチ デバイスが、タッチ デバイスの上にあるツールの存在を感知できるわけではありません。 RF ベースのスタイラス デジタイザなど、そうするものは、多くの場合、ツールがデジタイザの制限範囲内にあることを検出できます。

InputReaderコンポーネントは、タッチ ツールとホバリング ツールを区別するように注意します。同様に、タッチ ツールとホバリング ツールは、さまざまな方法でアプリケーションに報告されます。

タッチ ツールは、 MotionEvent.ACTION_DOWN 、 MotionEvent.ACTION_MOVEMotionEvent.ACTION_DOWNMotionEvent.ACTION_DOWN 、およびMotionEvent.ACTION_POINTER_DOWNを使用して、タッチ イベントとしてアプリケーションに報告されMotionEvent.ACTION_POINTER_UP

ホバリング ツールは、 MotionEvent.ACTION_HOVER_ENTERMotionEvent.ACTION_HOVER_MOVE 、およびMotionEvent.ACTION_HOVER_EXITを使用して、汎用モーション イベントとしてアプリケーションに報告されます。

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

  1. タッチ デバイス ドライバーは、実際にサポートする軸とボタンの軸とキー コードのみを登録する必要があります。余分な軸またはキー コードを登録すると、デバイス分類アルゴリズムが混乱したり、システムがデバイスの機能を誤って検出したりする可能性があります。

    たとえば、デバイスがBTN_TOUCHキー コードを報告する場合、システムはツールが実際に画面に触れているかどうかを示すために常にBTN_TOUCHが使用されると想定します。したがって、 BTN_TOUCHは、ツールが単に範囲内にありホバリングしていることを示すために使用しないでください。

  2. シングルタッチ デバイスは、次の 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 : (オプション)ツールタイプを報告します。

  3. マルチタッチ デバイスは、次の 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 : (オプション)ツールタイプを報告します。

  4. シングルタッチ プロトコルとマルチタッチ プロトコルの両方の軸が定義されている場合、マルチタッチ軸のみが使用され、シングルタッチ軸は無視されます。

  5. 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 - 2, minY - 3) などの minX および minY よりも小さいコンポーネントで座標の報告を開始するか、タッチの報告を完全に停止する必要があります。つまり、ユーザーの指が実際にアクティブ領域の外に触れている場合、タッチ スクリーンは (minX、minY) を報告するべきではありません

    タッチ座標をディスプレイの端にクランプすると、画面の端に人為的なハード境界が作成され、システムがディスプレイ領域の境界に出入りするモーションをスムーズに追跡できなくなります。

  6. ABS_PRESSUREまたはABS_MT_PRESSUREによって報告される値が報告される場合は、ツールがデバイスに接触している場合はゼロ以外であり、それ以外の場合はツールがホバリングしていることを示すためにゼロでなければなりません。

    圧力情報の報告はオプションですが、強くお勧めします。アプリケーションは圧力情報を使用して、圧力に敏感な描画やその他の効果を実装できます。

  7. ABS_TOOL_WIDTHABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINORABS_MT_WIDTH_MAJOR 、またはABS_MT_WIDTH_MINORによって報告される値は、ツールがデバイスに接触している場合はゼロ以外である必要がありますが、これは必須ではありません。例えば、タッチデバイスは、指のタッチ接触のサイズを測定できるが、スタイラスのタッチ接触のサイズを測定できない場合がある。

    サイズ情報の報告はオプションですが、強くお勧めします。アプリケーションは圧力情報を使用して、サイズに依存する描画やその他の効果を実装できます。

  8. ABS_DISTANCEまたはABS_MT_DISTANCEによって報告される値は、ツールがデバイスに接触しているときにゼロに近づく必要があります。ツールが直接接触している場合でも、距離はゼロ以外のままになる場合があります。報告される正確な値は、ハードウェアが距離を測定する方法によって異なります。

    距離情報の報告はオプションですが、スタイラス デバイスには推奨されます。

  9. ツールがデバイスに対して垂直である場合、 ABS_TILT_XおよびABS_TILT_Yによって報告される値はゼロになります。ゼロ以外の傾きは、工具が傾斜して保持されていることを示します。

    X 軸と Y 軸に沿った傾斜角度は、垂直からの角度で指定されると想定されます。中心点 (完全に垂直) は、各軸の(max + min) / 2で与えられます。中心点より小さい値は上または左への傾きを表し、中心点より大きい値は下または右への傾きを表します。

    InputReaderは、X および Y の傾斜コンポーネントを、0 からPI / 2ラジアンの範囲の垂直傾斜角度と、 -PIからPIラジアンの範囲の平面方向角度に変換します。この表現は、指のタッチを記述するために使用されるものと互換性のある向きの記述になります。

    傾斜情報の報告はオプションですが、スタイラス デバイスには推奨されます。

  10. 工具タイプがABS_MT_TOOL_TYPEによって報告された場合、 BTN_TOOL_*によって報告された工具タイプ情報よりも優先されます。ツール タイプ情報がまったく利用できない場合、ツール タイプはデフォルトでMotionEvent.TOOL_TYPE_FINGERになります。

  11. ツールは、次の条件に基づいてアクティブであると判断されます。

    • シングルタッチ プロトコルを使用する場合、 BTN_TOUCHまたはBTN_TOOL_*が 1 の場合、ツールはアクティブです。

      この条件は、 InputReaderがツールの性質 (接触しているかどうか、または少なくともそのツールの種類) について少なくとも何らかの情報を持っている必要があることを意味します。利用可能な情報がない場合、ツールは非アクティブ (範囲外) であると見なされます。

    • マルチタッチ プロトコル「A」を使用すると、ツールは最新の同期レポートに表示されるたびにアクティブになります。ツールが同期レポートに表示されなくなると、存在しなくなります。

    • マルチタッチ プロトコル「B」を使用する場合、アクティブなスロットがある限り、ツールはアクティブです。スロットがクリアされると、ツールは存在しなくなります。

  12. ツールは、次の条件に基づいてホバリングしていると判断されます。

    • ツールがBTN_TOOL_MOUSEまたはBTN_TOOL_LENSの場合、次の条件のいずれかが true であっても、ツールはホバリングしていません。

    • ツールがアクティブで、ドライバーが圧力情報を報告し、報告された圧力がゼロの場合、ツールはホバリングしています。

    • ツールがアクティブで、ドライバーがBTN_TOUCHキー コードをサポートし、 BTN_TOUCHの値が 0 の場合、ツールはホバリングしています。

  13. InputReaderは、マルチタッチ プロトコル 'A' と 'B' の両方をサポートします。新しいドライバーは「B」プロトコルを使用する必要がありますが、どちらでも機能します。

  14. Android Ice Cream Sandwich 4.0 の時点で、Linux 入力プロトコル仕様に準拠するためにタッチ スクリーン ドライバの変更が必要になる場合があります。

    次の変更が必要になる場合があります。

    • ツールが非アクティブになると (指が「上がる」)、その後のマルチタッチ同期レポートに表示されなくなります。すべてのツールが非アクティブになる (すべての指が「上がる」) 場合、ドライバーはSYN_MT_REPORTに続くSYN_REPORTなどの空の同期レポート パケットを送信する必要があります。

      以前のバージョンの Android では、圧力値 0 を送信することによって "up" イベントが報告されることが想定されていました。古い動作は 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. BACK または FORWARD ボタンが押された、または離された場合、 InputReaderInputDispatcherにキー イベントについて通知します。

  4. InputReaderは、仮想キーが押されたかどうかを判断します。その場合、キー イベントについてInputDispatcherに通知します。

  5. InputReaderは、タッチがディスプレイの境界内で開始されたかどうかを判断します。その場合、タッチ イベントについてInputDispatcherに通知します。

  6. タッチ ツールはなく、ホバリング ツールが少なくとも 1 つある場合、 InputReaderInputDispatcherにホバー イベントについて通知します。

  7. タッチ デバイスのタイプがpointerの場合、 InputReaderはポインター ジェスチャの検出を実行し、それに応じてポインターとスポットを移動し、ポインター イベントについてInputDispatcherに通知します。

  8. InputDispatcherは、 WindowManagerPolicyを使用して、イベントをディスパッチする必要があるかどうか、およびデバイスをスリープ解除する必要があるかどうかを決定します。次に、 InputDispatcherがイベントを適切なアプリケーションに配信します。

タッチ デバイスの構成

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

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

プロパティ

システムは、多くの入力デバイス構成プロパティに依存して、タッチ デバイスの動作を構成および調整します。

この理由の 1 つは、タッチ デバイスのデバイス ドライバーが、デバイス固有の単位を使用してタッチの特性を報告することが多いためです。

たとえば、多くのタッチ デバイスは、タッチによってトリガーされたセンサー ノードの総数など、デバイス固有の内部スケールを使用してタッチ接触面積を測定します。アプリケーションはタッチ デバイス センサー ノードの物理的なサイズやその他の特性を知る必要があるため、この生のサイズの値はアプリケーションにとって意味がありません。

システムは、入力デバイス構成ファイルにエンコードされたキャリブレーション パラメーターを使用して、タッチ デバイスによって報告された値をアプリケーションが理解できるより単純な標準表現にデコード、変換、および正規化します。

ドキュメント規約

文書化の目的で、次の規則を使用して、キャリブレーション プロセス中にシステムで使用される値を説明します。

生の軸の値

次の式は、タッチ デバイス ドライバーによって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の場合、システムは分類アルゴリズムに従ってデバイス タイプを自動的に検出します。

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

Honeycomb が登場する前は、すべてのタッチ デバイスはタッチ スクリーンであると想定されていました。

touch.orientationAware

定義: touch.orientationAware = 0 | 1

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

  • 値が1の場合、タッチ デバイスによって報告されるタッチ位置は、ディスプレイの向きが変わるたびに回転します。

  • 値が0の場合、タッチ デバイスによって報告されるタッチ位置は、ディスプレイの向きの変更の影響を受けません。

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

システムは、内部と外部のタッチ スクリーンとディスプレイを区別します。向きを認識する内蔵タッチ スクリーンは、内蔵ディスプレイの向きに基づいて回転します。向きを認識する外部タッチ スクリーンは、外部ディスプレイの向きに基づいて回転します。

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

Honeycomb が登場する前は、すべてのタッチ デバイスは向きを認識すると想定されていました。

touch.gestureMode

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

ポインター ジェスチャの表示モードを指定します。この構成プロパティは、タッチ デバイスのタイプがpointerである場合にのみ関連します。

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

  • 値が spot の場合、タッチパッド ジェスチャは、ジェスチャの重心を表すアンカーと、個々の指の位置を表す一連の円形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

TouchMajorTouchMinorToolMajorToolMinorSizeフィールド

TouchMajorフィールドとTouchMinorフィールドは、接触領域のおおよその寸法を出力単位 (ピクセル) で表します。

ToolMajorフィールドとToolMinorフィールドは、ツール自体のおおよその寸法を出力単位 (ピクセル) で表します。

Sizeフィールドは、タッチ デバイスが感知できる最大のタッチに対する正規化されたタッチのサイズを表します。最小の正規化サイズは 0.0 (非接触、または測定不能) であり、最大の正規化サイズは 1.0 (センサー領域が飽和) です。

おおよその長さと幅の両方を測定できる場合、 TouchMajorフィールドは接触領域の長い方の寸法を指定し、 TouchMinorフィールドは短い方の寸法を指定します。接触領域のおおよその直径しか測定できない場合、 TouchMajorフィールドとTouchMinorフィールドは等しくなります。

同様に、 ToolMajorフィールドはツールの断面積の長い寸法を指定し、 ToolMinorフィールドは短い寸法を指定します。

タッチ サイズが利用できないが、ツール サイズが利用可能な場合、ツール サイズはタッチ サイズに等しく設定されます。逆に、ツール サイズが利用できないが、タッチ サイズが利用可能な場合、タッチ サイズはツール サイズに等しく設定されます。

タッチ デバイスは、さまざまな方法でタッチ サイズとツール サイズを測定または報告します。現在の実装では、直径、面積、およびサーフェス単位の幾何学的境界ボックスの 3 種類の測定がサポートされています。

touch.size.calibration

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

タッチ ドライバーがタッチ サイズとツール サイズを報告するために使用する測定の種類を指定します。

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

  • 値が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に設定してください。

計算

TouchMajorTouchMinorToolMajorToolMinor 、およびSizeフィールドの計算は、指定されたキャリブレーション パラメーターによって異なります。

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 (完全な力) の間の正規化された値として表します。

圧力ゼロは、ツールがホバリングしていることを示します。

touch.pressure.calibration

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

タッチ ドライバーが圧力を報告するために使用する測定の種類を指定します。

  • 値がnoneの場合、圧力は不明であるため、タッチすると 1.0 に設定され、ホバリングすると 0.0 に設定されます。

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

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Calculation

The calculation of the Pressure field depends on the specified calibration parameters.

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 and Tilt Fields

The Orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI or PI .

The Tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.

  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.

  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Calculation

The calculation of the Orientation and Tilt fields depends on the specified calibration parameters and available input.

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 Field

The Distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

The calculation of the Distance field depends on the specified calibration parameters.

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

Example

# 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 will 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

Compatibility Notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# 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

The same virtual key map file can also be written on multiple lines.

# 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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 and height of 55 .

Example

Virtual key map file: /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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

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

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.

  5. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.

  6. Multiple finger motion: freeform gesture.

Palm rejection

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor and TouchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    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. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux