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 oggettiView
nel layout corrente. A continuerà a ricevere eventi di trascinamento, tra cui una possibile dell'evento: il listener di eventi di trascinamento deve restituiretrue
. 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 rilascioView
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 azioneACTION_DRAG_ENDED
. Se restituiscefalse
, 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 azioneACTION_DRAG_ENTERED
: l'ascoltatore può reagire evidenziandoView
. - 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 astartDragAndDrop()
che avvia l'operazione. L'ascoltatore è dovrebbe restituire il valore booleanotrue
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 diView
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 trascinamentoACTION_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 azioneACTION_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 riceveACTION_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:
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 |
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.
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'oggettoView
nell'oggettoView.DragShadowBuilder
, quindi i callback possono accedervi per creare l'ombra di trascinamento. La vista non deve essere necessariamenteView
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'elementoView
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 OggettoView.DragShadowBuilder
. Il campo è impostato sunull
. Devi estendereView.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
: aPoint
. L'ampiezza dell'ombra di trascinamento deve essere aumentatax
, con altezza compresay
.outShadowTouchPoint
: un oggettoPoint
. 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 iny
.onDrawShadow()
Subito dopo la chiamata a
onProvideShadowMetrics()
, la chiamata di sistemaonDrawShadow()
per creare l'ombra di trascinamento. Il metodo ha un singolo un oggettoCanvas
che i costrutti del sistema dai parametri che forniscionProvideShadowMetrics()
. Il metodo disegna l'ombra di trascinamento sull'elementoCanvas
.
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 oggettoContentInfo
. La richiama il metodoOnReceiveContentListener
.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.