Multi-Touch-Bewegungen

Schreiben Sie jetzt
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Weitere Informationen zur Verwendung von Berührungen und Eingaben in „Schreiben“
<ph type="x-smartling-placeholder"></ph> Multi-Touch-Gesten →

Bei einer Multi-Touch-Geste tippen mehrere Zeiger (Finger) auf den Bildschirm gleichzeitig. In diesem Dokument wird beschrieben, wie Sie Gesten erkennen, die mehrere Hinweise geben.

Mehrere Cursor verfolgen

Wenn mehrere Zeiger gleichzeitig auf den Bildschirm tippen, generiert das System folgenden Touch-Ereignissen:

  • ACTION_DOWN: wird gesendet, wenn der erste Zeiger auf den Bildschirm tippt. Dadurch wird die Geste gestartet. Die Die Zeigerdaten für diesen Zeiger befinden sich immer am Index 0 in der MotionEvent.
  • ACTION_POINTER_DOWN: wird gesendet, wenn zusätzliche Zeiger nach dem ersten auf dem Bildschirm erscheinen. Sie erhalten Index des Zeigers angezeigt wird, der gerade mit getActionIndex()
  • ACTION_MOVE: wird gesendet, wenn eine Änderung in einer Geste erfolgt, die beliebig viele Zeiger zeigen.
  • ACTION_POINTER_UP: wird gesendet, wenn ein nicht primärer Zeiger steigt. Sie können den Index der der gerade mit getActionIndex() gestiegen ist.
  • ACTION_UP: wird gesendet, wenn der letzte Zeiger den Bildschirm verlässt.
  • ACTION_CANCEL: zeigt an, dass die gesamte Geste einschließlich aller Zeiger abgebrochen wurde.

Touch-Gesten zum Starten und Beenden

Eine Geste besteht aus einer Reihe von Ereignissen, die mit einem ACTION_DOWN-Element beginnen. Ereignis und endet entweder mit einem ACTION_UP- oder ACTION_CANCEL. Es ist immer nur eine Bewegung aktiv. Die Die Aktionen UNTEN, VERSCHIEBEN, NACH OBEN und ABBRECHEN gelten für die gesamte Bewegung. Beispiel: mit ACTION_MOVE kann für alle Zeiger eine Bewegung anzeigen. in diesem Moment stört.

Zeiger im Blick behalten

Den Index und die ID des Zeigers verwenden, um die einzelnen Zeiger zu verfolgen Positionen innerhalb eines MotionEvent.

  • Index: Ein MotionEvent speichert den Cursor. Informationen in einem Array. Der Index eines Zeigers ist seine Position innerhalb dieses Array. Die meisten MotionEvent-Methoden verwenden den Zeigerindex als und nicht auf die Zeiger-ID.
  • ID: Jeder Zeiger hat auch eine ID-Zuordnung, die unverändert bleiben über Touch-Ereignisse hinweg bestehen, um die Verfolgung eines einzelnen Zeigers zu ermöglichen. während der gesamten Geste.

Einzelne Zeiger erscheinen in einer nicht definierten Reihenfolge innerhalb eines Bewegungsereignisses. Das heißt: Der Index eines Zeigers kann sich von einem Ereignis zum nächsten ändern, aber die Zeiger-ID eines Zeigers bleibt garantiert konstant, solange der Zeiger aktiv ist. Verwenden Sie die Methode getPointerId() zum Abrufen der Zeiger-ID, um den Zeiger über alle nachfolgenden Bewegungsereignisse in einer Geste. Verwende dann für aufeinanderfolgende Bewegungsereignisse das findPointerIndex() , um den Zeigerindex für eine bestimmte Zeiger-ID bei diesem Bewegungsereignis abzurufen. Beispiel:

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);
    ...
}

Um mehrere Touchpointer zu unterstützen, können Sie alle aktiven Zeiger mit ihre IDs an ihrer individuellen ACTION_POINTER_DOWN und Ereigniszeit: ACTION_DOWN. Entfernen Sie die Verweise unter ACTION_POINTER_UP- und ACTION_UP-Ereignisse. Möglicherweise Diese im Cache gespeicherten IDs helfen Ihnen dabei, andere Aktionsereignisse korrekt zu verarbeiten. Für Bei der Verarbeitung eines ACTION_MOVE-Ereignisses wird z. B. der Index für jede im Cache gespeicherte aktive Zeiger-ID enthält, rufen Sie die Koordinaten des Zeigers mithilfe des getX() und getY() und vergleichen diese Koordinaten dann mit den im Cache gespeicherten Koordinaten, um herauszufinden, welche Zeiger sich bewegt haben.

Verwenden Sie die getActionIndex()-Funktion mit ACTION_POINTER_UP- und ACTION_POINTER_DOWN-Ereignisse . Verwenden Sie diese Funktion nicht mit ACTION_MOVE-Ereignissen, da gibt immer 0 zurück.

MotionEvent Aktionen abrufen

Verwenden Sie die Methode getActionMasked() oder die Kompatibilitätsversion MotionEventCompat.getActionMasked() um die Aktion eines MotionEvent abzurufen. Im Gegensatz zur vorherigen getAction() ist getActionMasked() für mehrere Zeiger zeigen. Sie gibt die Aktion ohne die Zeigerindizes zurück. Für Aktionen mit einem gültigen Zeigerindex, verwenden Sie getActionIndex(), um den Index von Die mit der Aktion verknüpften Cursor, wie im folgenden Snippet gezeigt:

<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">
Abbildung 1. Multi-Touch-Zeichnung Muster zu erkennen.

Weitere Informationen

Weitere Informationen zu Eingabeereignissen finden Sie unter Referenzen: