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 Index0
in derMotionEvent
.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 mitgetActionIndex()
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 mitgetActionIndex()
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 meistenMotionEvent
-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:
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 ""; }
Weitere Informationen
Weitere Informationen zu Eingabeereignissen finden Sie unter Referenzen:
- Eingabeereignisse
- Sensoren Übersicht
- Benutzerdefinierten „Interaktivität“ ansehen
- Ziehen und skalieren