Jetpack Compose supporta il trascinamento con due modificatori:
dragAndDropSource
: specifica un componibile come punto iniziale del gesto di trascinamentodragAndDropTarget
: specifica un componibile che accetta i dati eliminati
Ad esempio, per consentire agli utenti di trascinare un'immagine nella tua app, crea un'immagine componibile
e aggiungi il modificatore dragAndDropSource
. Per configurare un target di rilascio, creane un altro
immagine componibile e aggiungi il tasto di modifica dragAndDropTarget
.
I modificatori possono essere applicati a più origini di trascinamento e a più obiettivi di rilascio.
I modificatori consentono alle app di condividere dati tra due o più componenti componibili
utilizzando ClipData
, interoperabile con le implementazioni di View
.
Avviare un evento di trascinamento
Per attivare gli eventi di trascinamento all'interno di un componente, aggiungi il modificatore dragAndDropSource
,
che assume come parametro una funzione di sospensione. La funzione definisce l'utente
che avvia l'operazione di trascinamento. Il modificatore dragAndDropSource
attende fino a quando riceve un evento di input del puntatore, quindi esegue la funzione lambda
passati al gestore di eventi. Usa la funzionalità lambda per rilevare vari eventi di input,
come tocchi o pressioni prolungate. Per ulteriori informazioni, consulta la sezione Suggerimento
in Compose.
L'evento di input del puntatore viene in genere implementato con una pressione prolungata nel seguente modo:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { // Transfer data here. }) }
Per avviare una sessione di trascinamento, chiama la funzione startTransfer()
.
All'interno di questo ambito, utilizza DragAndDropTransferData
per rappresentare
e trasferibili. I dati possono essere URI remoti, dati RTF
appunti, un file locale o altro, ma devono essere tutti racchiusi in un
ClipData
oggetto. Fornisci testo normale, ad esempio, come segue:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) ) }) }
Per consentire all'azione di trascinamento di oltrepassare i bordi dell'app, la
Il costruttore DragAndDropTransferData
accetta un argomento flags
. Nella
Nell'esempio seguente, la costante DRAG_FLAG_GLOBAL
specifica che i dati possono
essere trascinato da un'app all'altra:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ), flags = View.DRAG_FLAG_GLOBAL ) ) }) }
DragAndDropTransferData
accetta flag supportati dal sistema Android View. Consulta
l'elenco delle costanti View per un elenco esaustivo dei flag disponibili.
Ricevi dati relativi al lancio
Assegna il modificatore dragAndDropTarget
a un componibile per abilitarlo
per ricevere eventi di trascinamento. Il modificatore ha due parametri: il primo
funge da filtro e specifica il tipo di dati che il modificatore può accettare, mentre
il secondo fornisce i dati in un callback.
Tieni presente che devi ricordare l'istanza di callback. Il seguente snippet mostra come ricordare il callback:
val callback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { // Parse received data return true } } }
Lo snippet successivo mostra come gestire il testo normale eliminato:
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = callback )
La funzione di callback deve restituire true
se l'evento viene consumato oppure false
se l'evento viene rifiutato e non si propaga al componente principale.
Gestire gli eventi di trascinamento
Esegui l'override dei callback nell'interfaccia di DragAndDropTarget
per osservare quando
l'evento di trascinamento della selezione inizia, termina o entra o esce da un componente per
il controllo dell'interfaccia utente e del comportamento dell'app:
object : DragAndDropTarget { override fun onStarted(event: DragAndDropEvent) { // When the drag event starts } override fun onEntered(event: DragAndDropEvent) { // When the dragged object enters the target surface } override fun onEnded(event: DragAndDropEvent) { // When the drag event stops } override fun onExited(event: DragAndDropEvent) { // When the dragged object exits the target surface } override fun onDrop(event: DragAndDropEvent): Boolean = true }
Risorse aggiuntive
Codelab: trascina in Compose