Jetpack Compose mendukung tarik lalu lepas dengan dua pengubah:
dragAndDropSource: Menentukan composable sebagai titik awal gestur tarikdragAndDropTarget: Menentukan composable yang menerima data yang diletakkan
Misalnya, untuk memungkinkan pengguna menarik gambar di aplikasi Anda, buat composable
gambar dan tambahkan pengubah dragAndDropSource. Untuk menyiapkan target pelepasan,
buat composable gambar lain dan tambahkan pengubah dragAndDropTarget.
Pengubah dapat diterapkan ke beberapa sumber tarik dan beberapa target lepas.
Pengubah memungkinkan aplikasi berbagi data antara dua composable atau lebih menggunakan
ClipData, yang dapat dioperasikan 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 dapat
berupa URI jarak jauh, data rich text di papan klip, file lokal, atau lainnya, tetapi
semuanya harus digabungkan dalam objek ClipData. Berikan teks biasa, misalnya, sebagai berikut:
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) }
Untuk mengizinkan tindakan tarik melewati 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 pelepasan
Tetapkan pengubah dragAndDropTarget ke composable agar composable dapat menerima peristiwa tarik lalu lepas. Pengubah memiliki dua parameter: parameter pertama bertindak
sebagai filter dan menentukan jenis data yang dapat diterima pengubah, dan parameter
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 rilis 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 } } }
Penting untuk diingat bahwa DragAndDropEvent yang ditampilkan dari callback Compose
berbeda dengan yang diharapkan oleh metode requestDragAndDropPermission, jadi Anda perlu memanggil fungsi ekstensi toAndroidDragEvent() pada parameter sebelum
meneruskannya ke permintaan izin.
Cuplikan berikutnya menunjukkan cara menangani teks biasa yang diletakkan:
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 disebarkan ke komponen induk.
Menangani peristiwa tarik lalu lepas
Ganti callback di antarmuka DragAndDropTarget untuk mengamati kapan
peristiwa tarik lalu lepas dimulai, berakhir, atau masuk 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