Concetti principali

Le sezioni seguenti spiegano alcuni concetti chiave relativi al processo di trascinamento.

Procedura di trascinamento

Il processo di trascinamento prevede quattro passaggi o stati: avviato, continua, è calato ed è terminato.

Avviato

In risposta al gesto di trascinamento di un utente, l'applicazione chiama startDragAndDrop() per indicare al sistema di avviare un'operazione di trascinamento. La fornisce quanto segue:

  • I dati da trascinare.
  • Un callback per disegnare l'ombra di trascinamento
  • Metadati che descrivono i dati trascinati
  • Il sistema risponde richiamando la tua applicazione per ottenere una trascinamento ombra. Il sistema quindi mostra l'ombra di trascinamento sul dispositivo.
  • In seguito, il sistema invia un evento di trascinamento con il tipo di azione. ACTION_DRAG_STARTED all'evento di trascinamento listener di tutti gli oggetti View nel layout corrente. A continuerà a ricevere eventi di trascinamento, tra cui una possibile dell'evento: il listener di eventi di trascinamento deve restituire true. Questo registra il listener con il sistema. Solo gli ascoltatori registrati continuano a ricevere eventi di trascinamento. A questo punto, gli ascoltatori possono anche modificare aspetto del target di rilascio View per indicare che la vista può accettare un evento di rilascio.
  • Se il listener di eventi di trascinamento restituisce false, non riceve alcun trascinamento per l'operazione corrente finché il sistema non invia un evento di trascinamento con il tipo di azione ACTION_DRAG_ENDED. Se restituisce false, l'ascoltatore comunica al sistema che non è interessato nell'operazione di trascinamento e non vuole accettare i dati trascinati.
Avanzamento
L'utente continua il trascinamento. Quando l'ombra di trascinamento interseca riquadro di delimitazione di un target di rilascio, il sistema invia uno o più eventi di trascinamento al listener di eventi di trascinamento della destinazione. L'ascoltatore potrebbe modificare l'aspetto il target del calo View in risposta all'evento. Ad esempio, se l'evento indica che l'ombra di trascinamento entra nel riquadro di delimitazione della goccia target: tipo di azione ACTION_DRAG_ENTERED : l'ascoltatore può reagire evidenziando View.
Interrotto
L'utente rilascia l'ombra di trascinamento all'interno del riquadro di delimitazione di una goccia target. Il sistema invia al listener del target di rilascio un evento di trascinamento con azione digita ACTION_DROP. L'oggetto evento di trascinamento contiene i dati che vengono trasmessi al sistema chiamata a startDragAndDrop() che avvia l'operazione. L'ascoltatore è dovrebbe restituire il valore booleano true al sistema se il listener ha esito positivo elabora i dati rilasciati. : questo passaggio si verifica solo se l'utente rilascia l'ombra di trascinamento all'interno riquadro di delimitazione di View il cui listener è registrato per ricevere eventi di trascinamento (un obiettivo finale). Se l'utente rilascia l'ombra di trascinamento situazione, non viene inviato nessun evento di trascinamento ACTION_DROP.
Terminato

Dopo che l'utente rilascia l'ombra di trascinamento e dopo che il sistema l'ha inviata.

un evento di trascinamento con tipo di azione ACTION_DROP, se necessario, il sistema invia un evento di trascinamento con il tipo di azione ACTION_DRAG_ENDED per indicare che l'operazione di trascinamento è terminata. indipendentemente da dove si trova l'utente rilascia l'ombra di trascinamento. L'evento viene inviato a ogni listener registrati per ricevere eventi di trascinamento, anche se il listener riceve ACTION_DROP evento.

Ciascuno di questi passaggi è descritto più dettagliatamente nella sezione chiamata Un'operazione di trascinamento.

Eventi di trascinamento

Il sistema invia un evento di trascinamento sotto forma di oggetto DragEvent, che contiene un tipo di azione che descrive ciò che accade nella selezione e il processo di sviluppo. A seconda del tipo di azione, l'oggetto può anche contenere altri dati.

I listener di eventi di trascinamento ricevono l'oggetto DragEvent. Per conoscere il tipo di azione, chiamata degli ascoltatori DragEvent.getAction() Esistono sei possibili valori definiti da costanti nella classe DragEvent, descritti nella tabella 1:

Tabella 1. Tipi di azione DragEvent

Tipo di azione Significato
ACTION_DRAG_STARTED L'applicazione chiama startDragAndDrop() e ottiene un'ombra di trascinamento. Se il listener vuole continuare a ricevere eventi di trascinamento per questa operazione, deve restituire il valore booleano true di un sistema operativo completo.
ACTION_DRAG_ENTERED L'ombra di trascinamento entra nel riquadro di delimitazione del listener di eventi di trascinamento View. Questo è il primo tipo di azione evento per il listener riceve quando l'ombra di trascinamento entra nel riquadro di delimitazione.
ACTION_DRAG_LOCATION In seguito a un Evento ACTION_DRAG_ENTERED, l'ombra di trascinamento è ancora all'interno del riquadro di delimitazione del listener di eventi di trascinamento View.
ACTION_DRAG_EXITED Seguire ACTION_DRAG_ENTERED e almeno uno Evento ACTION_DRAG_LOCATION, l'ombra di trascinamento si sposta fuori dal riquadro di delimitazione del listener di eventi di trascinamento View.
ACTION_DROP L'ombra di trascinamento viene rilasciata sopra il listener di eventi di trascinamento View. Questo tipo di azione viene inviato a View listener dell'oggetto solo se il listener restituisce un valore booleano true in risposta ai Evento di trascinamento ACTION_DRAG_STARTED. Questo tipo di azione non è inviata se l'utente rilascia l'ombra di trascinamento su View con listener non registrato o se l'utente rilascia il trascinamento su tutto ciò che non fa parte del layout corrente.

Il listener restituisce il valore booleano true se ha elaborato correttamente il calo. In caso contrario, deve restituire false.

ACTION_DRAG_ENDED Il sistema sta terminando l'operazione di trascinamento. Questo tipo di azione non è necessariamente preceduto da un evento ACTION_DROP. Se il sistema invia un ACTION_DROP, ricevendo ACTION_DRAG_ENDED non implica che l'elemento eliminazione riuscita. Il listener deve chiamare getResult(), come mostrato nella tabella 2, per ottenere il valore che restituito in risposta a ACTION_DROP. Se ACTION_DROP evento non è stato inviato, poi getResult() restituisce false.

L'oggetto DragEvent contiene anche i dati e i metadati che l'applicazione fornisce al sistema nella chiamata a startDragAndDrop(). Alcuni dati sono valido solo per alcuni tipi di azioni, come riepilogato nella tabella 2. Per maggiori informazioni informazioni sugli eventi e sui dati associati, consulta la sezione chiamata A di trascinamento della selezione.

Tabella 2. Dati DragEvent validi per tipo di azione

getAction()
valore
getClipDescription()
valore
getLocalState()
valore
getX()
valore
getY()
valore
getClipData()
valore
getResult()
valore
ACTION_DRAG_STARTED &verifica; &verifica;        
ACTION_DRAG_ENTERED &verifica; &verifica;        
ACTION_DRAG_LOCATION &verifica; &verifica; &verifica; &verifica;    
ACTION_DRAG_EXITED &verifica; &verifica;        
ACTION_DROP &verifica; &verifica; &verifica; &verifica; &verifica;  
ACTION_DRAG_ENDED   &verifica;       &verifica;

I metodi DragEvent getAction(), describeContents(), writeToParcel(), e toString() sempre restituiscono dati validi.

Se un metodo non contiene dati validi per un particolare tipo di azione, viene restituito null o 0, a seconda del tipo di risultato.

Ombra trascinamento

Durante un'operazione di trascinamento, il sistema visualizza un'immagine che l'utente trascinamenti. Per lo spostamento dei dati, questa immagine rappresenta i dati trascinati. Per altre operazioni, l'immagine rappresenta alcuni aspetti dell'operazione di trascinamento.

L'immagine è chiamata ombra di trascinamento. Puoi crearlo con i metodi che dichiari un View.DragShadowBuilder . Passa il builder al sistema quando avvii un trascinamento utilizzando startDragAndDrop(). Nell'ambito della sua risposta a startDragAndDrop(), il sistema richiama i metodi di callback che definisci in View.DragShadowBuilder per ottenere un'ombra di trascinamento.

La classe View.DragShadowBuilder ha due costruttori:

View.DragShadowBuilder(View)

Questo costruttore accetta qualsiasi View oggetti. Il costruttore archivia l'oggetto View nell'oggetto View.DragShadowBuilder, quindi i callback possono accedervi per creare l'ombra di trascinamento. La vista non deve essere necessariamente View selezionato dall'utente per avviare l'operazione di trascinamento.

Se usi questo costruttore, non devi estendere View.DragShadowBuilder o sovrascrivere i relativi metodi. Per impostazione predefinita, viene visualizzata una ombra che ha lo stesso aspetto dell'elemento View passato come argomento, al centro del punto in cui l'utente tocca lo schermo.

View.DragShadowBuilder()

Se utilizzi questo costruttore, nessun oggetto View è disponibile nel Oggetto View.DragShadowBuilder. Il campo è impostato su null. Devi estendere View.DragShadowBuilder e sostituirne i metodi, altrimenti ottieni ombra di trascinamento invisibile. Il sistema non restituisce alcun errore.

La classe View.DragShadowBuilder ha due metodi che insieme creano il trascinamento ombra:

onProvideShadowMetrics()

Il sistema chiama questo metodo subito dopo la chiamata a startDragAndDrop(). Utilizza il metodo per inviare le dimensioni e il punto di tocco dell'ombra di trascinamento a all'interno del sistema. Il metodo ha due parametri:

outShadowSize: a Point . L'ampiezza dell'ombra di trascinamento deve essere aumentata x, con altezza compresa y.

outShadowTouchPoint: un oggetto Point. Il punto di contatto è la posizione all'interno dell'ombra di trascinamento che deve essere sotto il dito dell'utente durante il trascinamento. La posizione X è x e la posizione Y va in y.

onDrawShadow()

Subito dopo la chiamata a onProvideShadowMetrics(), la chiamata di sistema onDrawShadow() per creare l'ombra di trascinamento. Il metodo ha un singolo un oggetto Canvas che i costrutti del sistema dai parametri che fornisci onProvideShadowMetrics(). Il metodo disegna l'ombra di trascinamento sull'elemento Canvas.

Per migliorare le prestazioni, mantieni ridotte le dimensioni dell'ombra di trascinamento. Per una singola potresti voler utilizzare un'icona. In caso di selezione di più elementi, potresti vuoi usare icone in una serie anziché immagini intere distribuite sullo schermo.

Trascina listener di eventi e metodi di callback

Un View riceve eventi di trascinamento con un listener di eventi di trascinamento che implementa View.OnDragListener o con il metodo di callback onDragEvent() della vista. Quando il sistema chiama il metodo o il listener, fornisce un DragEvent.

Nella maggior parte dei casi, è preferibile utilizzare un listener anziché il metodo di callback. Quando progetti le interfacce utente, di solito non crei sottoclassi View, ma utilizzi il metodo di callback forzato a creare sottoclassi per eseguire l'override del metodo. Nella di confronto, puoi implementare una classe listener e poi utilizzarla con più oggetti View diversi. Puoi anche implementarlo come classe in linea anonima o un'espressione lambda. Per impostare il listener per un oggetto View, chiama setOnDragListener().

In alternativa, puoi modificare l'implementazione predefinita di onDragEvent() senza eseguire l'override del metodo. Imposta un OnReceiveContentListener in una vista; per ulteriori dettagli, vedi setOnReceiveContentListener(). Il metodo onDragEvent() esegue quindi le seguenti operazioni per impostazione predefinita:

  • Restituisce true in risposta alla chiamata a startDragAndDrop().
  • Chiamate performReceiveContent() se i dati trascinati vengono rilasciati nella vista. I dati vengono trasmessi come oggetto ContentInfo. La richiama il metodo OnReceiveContentListener.

  • Restituisce true se i dati trascinati vengono rilasciati nella vista e nella OnReceiveContentListener consuma uno qualsiasi dei contenuti.

Definisci il OnReceiveContentListener per gestire i dati in modo specifico per il tuo dell'app. Per la compatibilità con le versioni precedenti fino al livello API 24, utilizza la versione Jetpack di OnReceiveContentListener,

Puoi avere un listener di eventi di trascinamento e un metodo di callback per un oggetto View, in in questo caso il sistema chiama prima il listener. Il sistema non chiama a meno che il listener non restituisca false.

La combinazione del metodo onDragEvent() e View.OnDragListener è analoga alla combinazione onTouchEvent() e View.OnTouchListener utilizzati con gli eventi touch.