Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

タッチデバイス

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

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

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

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

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

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

タッチデバイスは多種多様であるため、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 入力プロパティがあることをレポートすると、デバイスタイプがタッチ スクリーンに設定されます。この条件は、ディスプレイが接続されており、そのディスプレイに直接入力タッチデバイスが接続されていることを前提としています。

  • 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_MOVE、、MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP により、タッチイベントとしてアプリケーションにレポートされます。

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

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

  1. タッチデバイス ドライバでは、軸、軸のキーコード、実際にサポートされるボタンのみが登録されます。軸またはキーコードを不必要に登録すると、デバイス分類アルゴリズムの処理が妨げられ、デバイスの機能が正しく検出されなくなります。

    たとえば、デバイスが 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 と minY より小さい要素(minX-2、minY-3)の座標をレポートするか、接触位置のレポートを停止するようにします。つまり、ユーザーの指が有効領域の外側に接触している場合には、タッチ スクリーンが minX、minY をレポートしないようにする必要があります。

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

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

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

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

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

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

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

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

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

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

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

  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 であっても、ツールは範囲内にはないとみなされます。

    • ツールが有効で、ドライバが圧力情報をレポートし、レポートされた圧力が 0 の場合、ツールは範囲内にあるとみなされます。

    • ツールが有効で、ドライバが BTN_TOUCH キーコードに対応しており、 の値が 0 の場合、ツールは範囲内にあるとみなされます。

  13. InputReader は、マルチタッチ プロトコル「タイプ A」と「タイプ B」の両方に対応しています。新しいドライバは「タイプ B」プロトコルを使用する必要がありますが、どちらのプロトコルでも正常に動作します。

  14. Android Ice Cream Sandwich 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. InputDispatcher は、WindowManagerPolicy を使用して、イベントをディスパッチする必要があるか、デバイスを復帰させる必要があるかを判断します。そして、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 の場合は、システムが分類アルゴリズムに従ってデバイスタイプを自動的に検出します。

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

Honeycomb より前のバージョンは、すべてのタッチデバイスがタッチ スクリーンとみなされていました。

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
    

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 の場合、サイズは 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 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
    

互換性に関する注意事項

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 本指でタップする: クリックする。

  2. 1 本指で動かす: ポインタを動かす。

  3. 1 本指で動かしてボタンを押す: ポインタをドラッグする。

  4. 2 本指を同時に同じ方向に動かす: ポインタの下の領域をその方向にドラッグする。ポインタ自体は動きません。

  5. 2 本の指を互いに向けて動かすか、互いから離れるように動かす: ポインタを囲む領域をパン/スケール/回転させる。ポインタ自体は動きません。

  6. 複数の指で動かす: フリーフォームのジェスチャー。

関連情報

  1. Linux マルチタッチ プロトコル
  2. Linux で利用可能なマルチタッチ デバイスの ENAC リスト