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 allerView
-Objekte im aktuellen Layout. Bis erhalten weiterhin Drag-Events, einschließlich möglicher -Ereignis: Der Drag-Event-Listener musstrue
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 AktionstypACTION_DRAG_ENDED
. Durch die Rückgabe vonfalse
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 – AktionstypACTION_DRAG_ENTERED
– kann der Zuhörer durch HervorhebenView
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 vonstartDragAndDrop()
, der den Vorgang startet. Der Listener ist Es wird erwartet, dass der boolesche Werttrue
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 einesView
, dessen Listener für den Empfang von Drag-Ereignissen registriert ist (ein Drop-Ziel). Wenn der Nutzer den Drag-Schatten loslässt, wird keinACTION_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 AktionstypACTION_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 ListenerACTION_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:
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 |
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.
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 dasView
-Objekt imView.DragShadowBuilder
-Objekt, sodass die Callbacks können Sie darauf zugreifen, um den Drag-Schatten zu erstellen. Die Ansicht muss keinView
, 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 dasView
, 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 imView.DragShadowBuilder
-Objekt. Das Feld ist aufnull
festgelegt. Sie müssen dieView.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-Schattensx
. Die Höhe liegt hier beiy
outShadowTouchPoint
: EinPoint
-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 inx
und die Position Y isty
.onDrawShadow()
Sofort nach dem Aufruf von
onProvideShadowMetrics()
ruft das System aufonDrawShadow()
, um den Drag-Schatten zu erstellen. Die Methode hat ein einzelnes -Arguments, einCanvas
-Objekt, das das System aus den Parametern erstellt, die Sie inonProvideShadowMetrics()
. Die -Methode zeichnet den Drag-Schatten auf der bereitgestelltenCanvas
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 alsContentInfo
-Objekt. Die ruft die MethodeOnReceiveContentListener
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.