Wichtige Konzepte

In den folgenden Abschnitten werden einige wichtige Konzepte des Drag-and-drop-Prozesses erläutert.

Drag-and-drop-Prozess

Der Drag-and-drop-Prozess umfasst vier Schritte oder Zustände: gestartet, wird fortgesetzt, abgebrochen und beendet.

Gestartet

Als Reaktion auf die Ziehbewegung des Nutzers ruft Ihre Anwendung startDragAndDrop(), um das System anzuweisen, einen Drag-and-drop-Vorgang zu starten. Die Die Argumente der Methode stellen Folgendes bereit:

  • Die zu ziehenden Daten.
  • Ein Callback zum Zeichnen des Drag-Schattens
  • Metadaten, die die per Drag-and-drop eingefügten Daten beschreiben
  • Das System reagiert mit einem Aufruf Ihrer Anwendung, um eine Drag-and-drop-Funktion zu erhalten. Schatten. Der Ziehschatten wird dann auf dem Gerät angezeigt.
  • Als Nächstes sendet das System ein Drag-Ereignis mit dem Aktionstyp ACTION_DRAG_STARTED zum Drag-Event Listener aller View-Objekte im aktuellen Layout. Bis erhalten weiterhin Drag-Events, einschließlich möglicher -Ereignis: Der Drag-Event-Listener muss true zurückgeben. Dadurch werden mit dem System kommunizieren. Nur registrierte Listener Drag-Events empfangen können. An dieser Stelle können Hörer auch die des Drop-Ziel-View-Objekts, um zu zeigen, dass die Ansicht Drop-Ereignis annehmen.
  • Wenn der Drag-Event-Listener false zurückgibt, empfängt er keine Drag-and-drop-Funktion. bis das System ein Drag-Ereignis sendet. mit dem Aktionstyp ACTION_DRAG_ENDED. Durch die Rückgabe von false teilt der Listener dem System mit, dass kein Interesse besteht. und möchte die per Drag-and-drop eingefügten Daten nicht akzeptieren.
.
Wird fortgesetzt
Der Nutzer setzt den Drag-Vorgang fort. Wenn sich der Drag-Schatten eines Markierungsrahmens gesetzt, sendet das System ein oder mehrere Drag-Events an Drag-Event-Listener des Ziels. Der Listener könnte das Erscheinungsbild das Drop-Ziel View als Reaktion auf das Ereignis. Wenn beispielsweise das Ereignis gibt an, dass der Drag-Schatten in den Markierungsrahmen des Drops eintritt. Ziel – Aktionstyp ACTION_DRAG_ENTERED – kann der Zuhörer durch Hervorheben View reagieren.
Abgebrochen
Der Nutzer löst den Drag-Schatten innerhalb des Begrenzungsrahmens eines Drops ab Ziel. Das System sendet dem Listener des Drop-Ziels ein Drag-Ereignis mit Aktion Geben Sie ACTION_DROP ein. Das Drag-Ereignis-Objekt enthält die Daten, die an das System in der Aufruf von startDragAndDrop(), der den Vorgang startet. Der Listener ist Es wird erwartet, dass der boolesche Wert true an das System zurückgegeben wird, wenn der Listener erfolgreich ist. die verworfenen Daten verarbeitet. : Dieser Schritt erfolgt nur, wenn der Nutzer den Drag-Schatten innerhalb der Begrenzungsrahmen eines View, dessen Listener für den Empfang von Drag-Ereignissen registriert ist (ein Drop-Ziel). Wenn der Nutzer den Drag-Schatten loslässt, wird kein ACTION_DROP-Drag-Event gesendet.
Beendet

Nachdem der Nutzer den Drag-Schatten losgelassen hat und das System

ein Drag-Ereignis mit dem Aktionstyp ACTION_DROP ausgelöst. sendet ein Drag-Ereignis mit dem Aktionstyp ACTION_DRAG_ENDED, um anzuzeigen, dass das Ereignis Drag-and-drop-Vorgang abgeschlossen ist. Dabei spielt es keine Rolle, wo die Nutzenden lässt den Drag-Schatten los. Das Ereignis wird an jeden Listener gesendet, sind für den Empfang von Drag-Ereignissen registriert, auch wenn der Listener ACTION_DROP-Ereignis.

Jeder dieser Schritte wird im Abschnitt zur Ein Drag-and-drop-Vorgang.

Drag-Events

Das System sendet ein Drag-Ereignis in Form eines DragEvent-Objekts, das enthält einen Aktionstyp, der beschreibt, was in dem Drag-and-drop passiert . Je nach Aktionstyp kann das Objekt auch andere Daten enthalten.

Drag-Event-Listener empfangen das DragEvent-Objekt. Um den Aktionstyp zu erhalten, Hörer aufrufen DragEvent.getAction() In der DragEvent-Klasse gibt es sechs mögliche Werte, die durch Konstanten definiert sind: die in Tabelle 1 beschrieben sind:

Tabelle 1 DragEvent-Aktionstypen

Aktionstyp Bedeutung
ACTION_DRAG_STARTED Die Anwendung ruft startDragAndDrop() auf und ruft Drag-Schatten. Wenn der Listener weiterhin Drag-Ereignisse empfangen möchte Für diesen Vorgang muss der boolesche Wert true an den System.
ACTION_DRAG_ENTERED Der Drag-Shadow erscheint in den Markierungsrahmen des Drag-Event-Listeners View Dies ist der erste Ereignisaktionstyp des Listeners. wird empfangen, wenn der Drag-Schatten den Markierungsrahmen erreicht.
ACTION_DRAG_LOCATION Im Anschluss an eine ACTION_DRAG_ENTERED-Ereignis, der Drag-Schatten bleibt unverändert innerhalb des Markierungsrahmens des Drag-Event-Listeners View.
ACTION_DRAG_EXITED Du folgst mindestens einem ACTION_DRAG_ENTERED ACTION_DRAG_LOCATION, wird der Drag-Schatten verschoben. außerhalb des Markierungsrahmens des Drag-Event-Listeners View
ACTION_DROP Der Drag-Schatten löst sich über den Drag-Event-Listener View Dieser Aktionstyp wird an View gesendet Listener des Objekts nur, wenn der Listener einen booleschen Wert zurückgibt true als Antwort auf die Drag-Event ACTION_DRAG_STARTED. Dieser Aktionstyp ist nicht wird gesendet, wenn der Nutzer den Drag-Schatten über einem View loslässt Wessen Listener nicht registriert ist oder wenn der Nutzer den Drag-Vorgang loslässt Schatten auf alles, was nicht Teil des aktuellen Layouts ist.

Der Listener gibt den booleschen Wert true zurück, wenn verarbeitet. Andernfalls muss ein false

ACTION_DRAG_ENDED Das System beendet den Drag-and-drop-Vorgang. Diesen Aktionstyp geht nicht unbedingt ein ACTION_DROP-Ereignis voraus. Wenn sendet das System eine ACTION_DROP, Der Aktionstyp ACTION_DRAG_ENDED impliziert nicht, dass der Drop erfolgreich. Der Listener muss getResult(), wie in Tabelle 2 gezeigt, um den Wert zu erhalten, als Antwort auf ACTION_DROP zurückgegeben. Wenn ein ACTION_DROP Ereignis wird nicht gesendet, dann getResult() gibt false zurück.

Das DragEvent-Objekt enthält außerdem die Daten und Metadaten, die Ihre Anwendung an das System im Aufruf von startDragAndDrop() übergeben. Einige der Daten sind ist nur für bestimmte Aktionstypen gültig, wie in Tabelle 2 zusammengefasst. Weitere Informationen Informationen zu Ereignissen und den zugehörigen Daten finden Sie im Abschnitt A Drag-and-drop.

Tabelle 2: Gültige DragEvent-Daten nach Aktionstyp

getAction()
Wert
getClipDescription()
Wert
getLocalState()
Wert
getX()
Wert
getY()
Wert
getClipData()
Wert
getResult()
Wert
ACTION_DRAG_STARTED ✓ ✓        
ACTION_DRAG_ENTERED ✓ ✓        
ACTION_DRAG_LOCATION ✓ ✓ ✓ ✓    
ACTION_DRAG_EXITED ✓ ✓        
ACTION_DROP ✓ ✓ ✓ ✓ ✓  
ACTION_DRAG_ENDED   ✓       ✓

Die DragEvent-Methoden getAction(), describeContents(), writeToParcel(), und toString() immer gibt gültige Daten zurück.

Wenn eine Methode keine gültigen Daten für einen bestimmten Aktionstyp enthält, gibt sie null oder 0, je nach Ergebnistyp.

Drag-Schatten

Während eines Drag-and-drop-Vorgangs zeigt das System ein Bild an, das der Nutzer Drags. Zur Datenbewegung stellt dieses Bild die Daten dar, die gezogen werden. Für anderen Vorgängen gibt das Bild einen Aspekt des Drag-Vorgangs wieder.

Das Bild wird als Ziehschatten bezeichnet. Sie erstellen sie mit Methoden, die Sie für eine View.DragShadowBuilder -Objekt enthält. Sie übergeben den Builder an das System, wenn Sie ein Drag-and-drop starten. Vorgang mit startDragAndDrop(). Im Rahmen der Reaktion auf startDragAndDrop(), das System ruft die Callback-Methoden auf, die du in View.DragShadowBuilder, um einen Ziehschatten zu erhalten.

Die View.DragShadowBuilder-Klasse hat zwei Konstruktoren:

View.DragShadowBuilder(View)

Dieser Konstruktor akzeptiert alle View-Objekte. Der Konstruktor speichert das View-Objekt im View.DragShadowBuilder-Objekt, sodass die Callbacks können Sie darauf zugreifen, um den Drag-Schatten zu erstellen. Die Ansicht muss kein View, die der Nutzer auswählt, um den Drag-Vorgang zu starten.

Wenn Sie diesen Konstruktor verwenden, müssen Sie View.DragShadowBuilder oder ihre Methoden überschreiben. Standardmäßig wird eine Drag-and-drop-Funktion angezeigt, Schatten, der das gleiche Aussehen hat wie das View, das Sie als Argument übergeben. in der Mitte unter der Stelle angezeigt, an der der Nutzer den Bildschirm berührt.

View.DragShadowBuilder()

Wenn Sie diesen Konstruktor verwenden, ist kein View-Objekt im View.DragShadowBuilder-Objekt. Das Feld ist auf null festgelegt. Sie müssen die View.DragShadowBuilder und überschreiben die zugehörigen Methoden. Andernfalls erhalten Sie eine unsichtbaren Drag-Schatten. Das System gibt keinen Fehler aus.

Die Klasse View.DragShadowBuilder hat zwei Methoden, die zusammen das Drag-and-drop erstellen Schatten:

onProvideShadowMetrics()

Das System ruft diese Methode sofort nach dem Aufruf von startDragAndDrop() auf. Verwenden Sie die Methode, um die Abmessungen und den Berührungspunkt des Drag-Schattens an System. Die Methode hat zwei Parameter:

outShadowSize: Point -Objekt enthält. Die Breite des Drag-Schattens x. Die Höhe liegt hier bei y

outShadowTouchPoint: Ein Point-Objekt. Der Touchpoint ist der Ort, an dem innerhalb des Drag-Schattens, der sich beim Ziehen unter dem Finger des Nutzers befinden muss. Die Position X ist in x und die Position Y ist y.

onDrawShadow()

Sofort nach dem Aufruf von onProvideShadowMetrics() ruft das System auf onDrawShadow(), um den Drag-Schatten zu erstellen. Die Methode hat ein einzelnes -Arguments, ein Canvas-Objekt, das das System aus den Parametern erstellt, die Sie in onProvideShadowMetrics(). Die -Methode zeichnet den Drag-Schatten auf der bereitgestellten Canvas

Halten Sie den Drag-Schatten klein, um die Leistung zu verbessern. Für eine können Sie ein Symbol verwenden. Bei einer Auswahl aus mehreren Artikeln statt Vollbildbilder, die sich über den Bildschirm verteilen, Symbole in einem Stapel verwenden möchten.

Drag-Event-Listener und Callback-Methoden

Ein View empfängt Drag-Ereignisse mit einem Drag-Event-Listener, der View.OnDragListener oder mit der Callback-Methode onDragEvent() der Ansicht verwenden. Wann? ruft das System die Methode oder den Listener auf. Argument DragEvent

In den meisten Fällen ist die Verwendung eines Listeners der Callback-Methode vorzuziehen. Wann? Wenn Sie Benutzeroberflächen entwerfen, erstellen Sie normalerweise keine abgeleiteten View-Klassen, sondern verwenden die -Rückrufmethode erzwingt, dass Sie Unterklassen erstellen, um die Methode zu überschreiben. In können Sie eine Listener-Klasse implementieren und dann mit mehreren verschiedene View-Objekte. Sie können sie auch als anonyme Inline-Klasse implementieren. oder Lambda-Ausdruck enthalten. Rufen Sie zum Festlegen des Listeners für ein View-Objekt den folgenden Befehl auf: setOnDragListener().

Alternativ können Sie die Standardimplementierung von onDragEvent() ändern. ohne die Methode zu überschreiben. Legen Sie ein OnReceiveContentListener pro Datenansicht finden Sie weitere Informationen unter setOnReceiveContentListener() Die Methode onDragEvent() führt dann standardmäßig Folgendes aus:

  • Gibt als Antwort auf den Aufruf von startDragAndDrop() „true“ zurück.
  • Anrufe performReceiveContent() wenn die Drag-and-drop-Daten in der Ansicht abgelegt werden. Die Daten werden an die als ContentInfo-Objekt. Die ruft die Methode OnReceiveContentListener auf.

  • Gibt "true" zurück, wenn die Drag-and-drop-Daten in der Ansicht abgelegt wurden und das Feld OnReceiveContentListener verbraucht einen beliebigen Inhalt.

Definieren Sie die OnReceiveContentListener, um die Daten speziell für Ihre Verwenden Sie für Abwärtskompatibilität bis API-Level 24 die Jetpack-Version von OnReceiveContentListener

Sie können einen Drag-Event-Listener und eine Callback-Methode für ein View-Objekt haben, In diesem Fall ruft das System zuerst den Listener auf. Das System ruft die Callback-Methode fest, es sei denn, der Listener gibt false zurück.

Die Kombination aus der Methode onDragEvent() und View.OnDragListener ist analog zur Kombination der onTouchEvent() und View.OnTouchListener bei Touch-Ereignissen verwendet werden.