Jetpack Compose admite la función de arrastrar y soltar con dos modificadores:
dragAndDropSource
: Especifica un elemento componible como punto de partida del gesto de arrastredragAndDropTarget
: Especifica un elemento componible que acepta los datos soltados.
Por ejemplo, para permitir que los usuarios arrastren una imagen en tu app, crea una imagen componible y agrega el modificador dragAndDropSource
. Si quieres configurar un destino para soltar, crea otra imagen componible y agrega el modificador dragAndDropTarget
.
Los modificadores se pueden aplicar a varias fuentes de arrastre y a varios destinos para soltar.
Los modificadores permiten que las apps compartan datos entre dos o más elementos componibles a través de ClipData
, que es interoperable con implementaciones de View
.
Cómo especificar una fuente de arrastre
Para habilitar eventos de arrastre dentro de un componente, agrega el modificador dragAndDropSource
.
Toma una función como parámetro. Dentro de esta función, usa DragAndDropTransferData
para representar los datos transferibles. Los datos pueden ser un URI remoto, datos de texto enriquecido en el portapapeles, un archivo local o mucho más, pero todos deben unirse a un objeto ClipData
. Proporciona texto sin formato, por ejemplo, de la siguiente manera:
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) }
Para permitir que la acción de arrastre cruce los bordes de la app, el constructor DragAndDropTransferData
acepta un argumento flags
. En el siguiente ejemplo, la constante DRAG_FLAG_GLOBAL
especifica que los datos se pueden arrastrar de una app a otra:
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "image Url", url ), flags = View.DRAG_FLAG_GLOBAL ) }
DragAndDropTransferData
acepta marcas compatibles con el sistema Android View.
Consulta la lista de constantes de View para obtener una lista detallada de las marcas disponibles.
Recibir datos de la bajada
Asigna el modificador dragAndDropTarget
a un elemento componible para permitir que reciba eventos de arrastrar y soltar. El modificador tiene dos parámetros: el primero actúa como un filtro y especifica el tipo de datos que puede aceptar el modificador, y el segundo entrega los datos en una devolución de llamada.
Ten en cuenta que se debe recordar la instancia de devolución de llamada. En el siguiente fragmento, se muestra cómo recordar la devolución de llamada:
val callback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { // Parse received data return true } } }
En el siguiente fragmento, se muestra cómo controlar el texto sin formato descartado:
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = callback )
La función de devolución de llamada debe mostrar true
si se consume el evento, o false
si el evento se rechaza y no se propaga al componente superior.
Cómo controlar eventos de arrastrar y soltar
Anula las devoluciones de llamada en la interfaz DragAndDropTarget
para observar cuándo un evento de arrastrar y soltar comienza, finaliza, ingresa o sale de un componente para controlar con precisión la IU y el comportamiento de la 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 }
Recursos adicionales
Codelab: Arrastrar y soltar en Compose