Arrastar e soltar

O Jetpack Compose oferece suporte ao recurso de arrastar e soltar usando dois modificadores:

  • dragAndDropSource: especifica um elemento combinável como o ponto de partida do gesto de arrastar.
  • dragAndDropTarget: especifica um elemento combinável que aceita os dados soltos.

Por exemplo, para permitir que os usuários arrastem uma imagem no app, crie uma imagem combinável e adicione o modificador dragAndDropSource. Para configurar um destino de soltar, crie outro elemento combinável de imagem e adicione o modificador dragAndDropTarget.

Os modificadores podem ser aplicados a várias origens de arrastar e vários destinos de soltar.

Os modificadores permitem que os apps compartilhem dados entre dois ou mais elementos combináveis. usando ClipData, que é interoperável com implementações de View.

Iniciar um evento de arrastar

Para ativar eventos de arrastar dentro de um componente, adicione o modificador dragAndDropSource, que usa uma função de suspensão como parâmetro. A função define o usuário interação que inicia a operação de arrastar. O modificador dragAndDropSource aguarda até receber um evento de entrada de ponteiro e executa o lambda. passados para o manipulador de eventos. Usar o lambda para detectar vários eventos de entrada como toques ou toques longos. Para mais informações, consulte Ponteiro entrada no Compose.

O evento de entrada do ponteiro geralmente é um pressionamento longo implementado da seguinte maneira:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        // Transfer data here.
    })
}

Para iniciar uma sessão de arrastar e soltar, chame a função startTransfer(). Dentro desse escopo, use DragAndDropTransferData para representar o transferíveis. Os dados podem ser um URI remoto, dados de rich text na área de transferência, um arquivo local, entre outros, mas todos precisam ser unidos em um ClipData. Forneça texto simples, por exemplo:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                )
            )
        )
    })
}

Para permitir que a ação de arrastar cruze as bordas do aplicativo, o O construtor DragAndDropTransferData aceita um argumento flags. Na exemplo a seguir, a constante DRAG_FLAG_GLOBAL especifica que os dados podem ser arrastados de um aplicativo para outro:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                ),
                flags = View.DRAG_FLAG_GLOBAL
            )
        )
    })
}

DragAndDropTransferData aceita flags com suporte ao sistema de visualização do Android. Consulte a lista de constantes de View para ver uma lista completa das sinalizações disponíveis.

Receber dados de soltar

Atribuir o modificador dragAndDropTarget a um elemento combinável para ativar esse recurso para receber eventos de arrastar e soltar. O modificador tem dois parâmetros: o primeiro atua como um filtro e especifica o tipo de dados que o modificador pode aceitar, e a entrega os dados em um retorno de chamada.

A instância do callback precisa ser lembrada. O snippet a seguir mostra como memorizar o retorno de chamada:

val callback = remember {
    object : DragAndDropTarget {
        override fun onDrop(event: DragAndDropEvent): Boolean {
            // Parse received data
            return true
        }
    }
}

O próximo snippet demonstra como lidar com texto simples solto:

Modifier.dragAndDropTarget(
    shouldStartDragAndDrop = { event ->
        event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN)
    }, target = callback
)

A função de callback retornará true se o evento for consumido. Ou false se o evento for recusado e não for propagado para o componente pai.

Processar eventos de arrastar e soltar

Modifique os callbacks na interface DragAndDropTarget para observar quando uma um evento de arrastar e soltar começa, termina ou entra ou sai de um componente para da IU e do comportamento do aplicativo:

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
}

Outros recursos

Codelab: Arrastar e soltar no Compose