Tarik lalu lepas

Jetpack Compose mendukung tarik lalu lepas dengan dua pengubah:

Misalnya, untuk memungkinkan pengguna menarik gambar di aplikasi Anda, buat composable gambar dan tambahkan pengubah dragAndDropSource. Untuk menyiapkan target lepas, buat composable gambar lain dan tambahkan pengubah dragAndDropTarget.

Pengubah dapat diterapkan ke beberapa sumber tarik dan beberapa target lepas.

Pengubah memungkinkan aplikasi berbagi data antar-composable dua atau lebih menggunakan ClipData, yang dapat dioperasikan secara interoperabilitas dengan implementasi View.

Menentukan sumber tarik

Untuk mengaktifkan peristiwa tarik di dalam komponen, tambahkan pengubah dragAndDropSource. Fungsi ini menggunakan fungsi sebagai parameter. Di dalam fungsi ini, gunakan DragAndDropTransferData untuk merepresentasikan data yang dapat ditransfer. Data tersebut dapat berupa URI jarak jauh, data teks kaya di papan klip, file lokal, atau lainnya, tetapi semuanya harus digabungkan dalam objek ClipData. Berikan teks biasa, misalnya, seperti berikut:

Modifier.dragAndDropSource { _ ->
    DragAndDropTransferData(
        ClipData.newPlainText(
            "image Url", url
        )
    )
}

Untuk mengizinkan tindakan tarik melintasi batas aplikasi, konstruktor DragAndDropTransferData menerima argumen flags. Dalam contoh berikut, konstanta DRAG_FLAG_GLOBAL menentukan bahwa data dapat ditarik dari satu aplikasi ke aplikasi lain:

Modifier.dragAndDropSource { _ ->
    DragAndDropTransferData(
        ClipData.newPlainText(
            "image Url", url
        ),
        flags = View.DRAG_FLAG_GLOBAL
    )
}

DragAndDropTransferData menerima flag yang didukung oleh sistem View Android. Lihat daftar konstanta View untuk mengetahui daftar lengkap flag yang tersedia.

Menerima data drop

Tetapkan pengubah dragAndDropTarget ke composable agar composable dapat menerima peristiwa tarik lalu lepas. Pengubah memiliki dua parameter: yang pertama bertindak sebagai filter dan menentukan jenis data yang dapat diterima pengubah, dan yang kedua mengirimkan data dalam callback.

Perhatikan bahwa instance callback harus diingat. Cuplikan berikut menunjukkan cara mengingat callback:

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

Untuk menerima data dari aplikasi lain, gunakan requestDragAndDropPermission untuk mengaktifkan penerimaan, dan lepaskan setelah selesai:

val externalAppCallback = remember {
    object : DragAndDropTarget {
        override fun onDrop(event: DragAndDropEvent): Boolean {
            val permission =
                activity.requestDragAndDropPermissions(event.toAndroidDragEvent())
            // Parse received data
            permission?.release()
            return true
        }
    }
}

Perlu diingat bahwa DragAndDropEvent yang ditampilkan dari callback Compose berbeda dengan yang diharapkan oleh metode requestDragAndDropPermission, sehingga Anda perlu memanggil fungsi ekstensi toAndroidDragEvent() pada parameter sebelum meneruskannya ke permintaan izin.

Cuplikan berikutnya menunjukkan cara menangani teks biasa yang dihapus:

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

Fungsi callback harus menampilkan true jika peristiwa digunakan, atau false jika peristiwa ditolak dan tidak di-propagasi ke komponen induk.

Menangani peristiwa tarik lalu lepas

Ganti callback di antarmuka DragAndDropTarget untuk mengamati saat peristiwa tarik lalu lepas dimulai, berakhir, atau memasuki atau keluar dari komponen untuk kontrol UI dan perilaku aplikasi yang akurat:

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
}

Referensi lainnya

Codelab: Tarik lalu lepas di Compose