マルチタップ操作の処理

Compose を試す
Jetpack Compose は、Android に推奨される UI ツールキットです。Compose でタップと入力を使用する方法について学習します。
<ph type="x-smartling-placeholder"></ph> マルチタッチ ジェスチャー →

マルチタッチ ジェスチャーとは、複数のポインタ(指)で画面をタップすることです。 できます。このドキュメントでは、 使用できます。

複数のポインタのトラッキング

複数のポインタが同時に画面をタップすると、 次のタッチイベントがあります。

  • ACTION_DOWN: 最初のポインタで画面をタップしたときに送信されます。これで操作が開始されます。「 このポインタのポインタデータは常に、インデックス 0 にあります。 MotionEvent
  • ACTION_POINTER_DOWN: 最初のポインタより後に追加のポインタが画面に入ったときに送信されます。取得できる値: 使用したばかりのポインタのインデックス。 getActionIndex()
  • ACTION_MOVE: 1 つの操作で変更が発生すると送信され、 使用できます。
  • ACTION_POINTER_UP: 非プライマリ ポインタが上昇したときに送信されます。アプリケーションのインデックスを getActionIndex() を使用して上昇したばかりのポインタ。
  • ACTION_UP: 最後のポインタが画面から出たときに送信されます。
  • ACTION_CANCEL: すべてのポインタを含む操作全体がキャンセルされることを示します。

開始と終了のジェスチャー

ジェスチャーは、ACTION_DOWN で始まる一連のイベントです。 ACTION_UP または ACTION_CANCEL イベント。一度に実行できる操作は 1 つのみです。「 DOWN、MOVE、UP、CANCEL のアクションは、ジェスチャー全体に適用されます。たとえば、 ACTION_MOVE を含むイベントは、すべてのポインタの移動を示すことができます。 停止します

ポインタを追跡する

ポインタのインデックスと ID を使用して個々のポインタを追跡する MotionEvent 内の位置。

  • インデックス: MotionEvent はポインタを格納します。 配列内の情報ですポインタのインデックスは、このオブジェクト内における あります。ほとんどの MotionEvent メソッドは、次のようにポインタ インデックスを受け取ります。 パラメータを使用します。
  • ID: 各ポインタには、保持される ID マッピングもあります。 個々のポインタをトラッキングできるように、タッチイベント全体で持続します。 操作全体で維持できます。

個々のポインタは、未定義の順序でモーション イベント内に表示されます。したがって、次のようになります。 ポインタのインデックスはイベント間で変わることがありますが、ポインタの ID は は、ポインタが存続している限り一定の状態が保たれることが保証されます。 アクティブです。こちらの getPointerId() メソッドを使ってポインタの ID を取得し、以降のすべての モーションイベントを ジェスチャーでサポートします連続するモーション イベントの場合は、 findPointerIndex() メソッドを使用して、そのモーション イベントの特定のポインタ ID のポインタ インデックスを取得します。 例:

Kotlin

private var mActivePointerId: Int = 0

override fun onTouchEvent(event: MotionEvent): Boolean {
    ...
    // Get the pointer ID.
    mActivePointerId = event.getPointerId(0)

    // ... Many touch events later...

    // Use the pointer ID to find the index of the active pointer
    // and fetch its position.
    val (x: Float, y: Float) = event.findPointerIndex(mActivePointerId).let { pointerIndex ->
        // Get the pointer's current position.
        event.getX(pointerIndex) to event.getY(pointerIndex)
    }
    ...
}

Java

private int mActivePointerId;

public boolean onTouchEvent(MotionEvent event) {
    ...
    // Get the pointer ID.
    mActivePointerId = event.getPointerId(0);

    // ... Many touch events later...

    // Use the pointer ID to find the index of the active pointer
    // and fetch its position.
    int pointerIndex = event.findPointerIndex(mActivePointerId);
    // Get the pointer's current position.
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);
    ...
}

複数のタッチポインタをサポートするには、すべてのアクティブなポインタを 個人の ACTION_POINTER_DOWN の身分証明書 予定の時刻: ACTION_DOWN。次の場所でキャッシュからポインタを削除します。 ACTION_POINTER_UPACTION_UP のイベントをもしかしたら、 キャッシュに保存された ID が他のアクション イベントを正しく処理できることを確認します。対象 たとえば、ACTION_MOVE イベントを処理するときに、 キャッシュされたアクティブなポインタの ID ごとに、 getX() および getY() その座標をキャッシュに保存された座標と比較することで、 移動されたポインタを検出できます。

getActionIndex() 関数を次のように使用します。 ACTION_POINTER_UPACTION_POINTER_DOWN のイベント のみです。この関数を ACTION_MOVE イベントと併用しないでください。これは、 常に 0 を返します。

MotionEvent アクションを取得する

こちらの getActionMasked() または互換バージョンを MotionEventCompat.getActionMasked() MotionEvent のアクションを取得します。以前のモデルとは異なり getAction() メソッドに加え、getActionMasked() は複数の 使用できます。ポインタ インデックスなしでアクションを返します。アクションが 有効なポインタ インデックス。getActionIndex() を使用して、そのインデックスを 次のスニペットに示すように、アクションに関連付けられたポインタ。

<ph type="x-smartling-placeholder">

Kotlin

val (xPos: Int, yPos: Int) = MotionEventCompat.getActionMasked(event).let { action ->
    Log.d(DEBUG_TAG, "The action is ${actionToString(action)}")
    // Get the index of the pointer associated with the action.
    MotionEventCompat.getActionIndex(event).let { index ->
        // The coordinates of the current screen contact, relative to
        // the responding View or Activity.
        MotionEventCompat.getX(event, index).toInt() to MotionEventCompat.getY(event, index).toInt()
    }
}

if (event.pointerCount > 1) {
    Log.d(DEBUG_TAG, "Multitouch event")

} else {
    // Single touch event.
    Log.d(DEBUG_TAG, "Single touch event")
}

...

// Given an action int, returns a string description.
fun actionToString(action: Int): String {
    return when (action) {
        MotionEvent.ACTION_DOWN -> "Down"
        MotionEvent.ACTION_MOVE -> "Move"
        MotionEvent.ACTION_POINTER_DOWN -> "Pointer Down"
        MotionEvent.ACTION_UP -> "Up"
        MotionEvent.ACTION_POINTER_UP -> "Pointer Up"
        MotionEvent.ACTION_OUTSIDE -> "Outside"
        MotionEvent.ACTION_CANCEL -> "Cancel"
        else -> ""
    }
}

Java

int action = MotionEventCompat.getActionMasked(event);
// Get the index of the pointer associated with the action.
int index = MotionEventCompat.getActionIndex(event);
int xPos = -1;
int yPos = -1;

Log.d(DEBUG_TAG,"The action is " + actionToString(action));

if (event.getPointerCount() > 1) {
    Log.d(DEBUG_TAG,"Multitouch event");
    // The coordinates of the current screen contact, relative to
    // the responding View or Activity.
    xPos = (int)MotionEventCompat.getX(event, index);
    yPos = (int)MotionEventCompat.getY(event, index);

} else {
    // Single touch event.
    Log.d(DEBUG_TAG,"Single touch event");
    xPos = (int)MotionEventCompat.getX(event, index);
    yPos = (int)MotionEventCompat.getY(event, index);
}
...

// Given an action int, returns a string description
public static String actionToString(int action) {
    switch (action) {

        case MotionEvent.ACTION_DOWN: return "Down";
	case MotionEvent.ACTION_MOVE: return "Move";
	case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";
	case MotionEvent.ACTION_UP: return "Up";
	case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";
	case MotionEvent.ACTION_OUTSIDE: return "Outside";
	case MotionEvent.ACTION_CANCEL: return "Cancel";
    }
    return "";
}
<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
図 1.マルチタッチ描画 パターンです。

参考情報

入力イベントの詳細については、以下をご覧ください。 参照: