Jetpack Compose รองรับการลากและวางด้วยแป้นกดร่วม 2 แบบดังนี้
dragAndDropSource
: ระบุ Composable เป็นจุดเริ่มต้นของท่าทางสัมผัสการลากdragAndDropTarget
: ระบุ Composable ที่ยอมรับข้อมูลที่ลบออก
เช่น หากต้องการให้ผู้ใช้ลากรูปภาพในแอป ให้สร้างรูปภาพ Composable และเพิ่มตัวแก้ไข dragAndDropSource
หากต้องการตั้งค่าเป้าหมายการลดลง ให้สร้างรูปภาพ Composable อีกรูปหนึ่ง และเพิ่มตัวแก้ไข dragAndDropTarget
ตัวแก้ไขใช้ได้กับแหล่งที่มาของการลากหลายรายการและเป้าหมายการปล่อยหลายรายการ
ตัวแก้ไขช่วยให้แอปแชร์ข้อมูลระหว่าง Composable ตั้งแต่ 2 รายการขึ้นไปโดยใช้ ClipData
ซึ่งทำงานร่วมกับการติดตั้งใช้งาน View
ได้
ระบุแหล่งที่มาสำหรับการลาก
หากต้องการเปิดใช้เหตุการณ์การลากภายในคอมโพเนนต์ ให้เพิ่มตัวแก้ไข dragAndDropSource
ซึ่งจะใช้ฟังก์ชันเป็นพารามิเตอร์ ภายในฟังก์ชันนี้ ให้ใช้ DragAndDropTransferData
เพื่อแสดงข้อมูลที่โอนได้ ข้อมูลนี้อาจเป็น URI ระยะไกล, ข้อมูล Rich Text ในคลิปบอร์ด, ไฟล์ในเครื่อง หรืออื่นๆ แต่ข้อมูลทั้งหมดนี้จะต้องรวมอยู่ในออบเจ็กต์ ClipData
ระบุข้อความธรรมดา
ดังตัวอย่างต่อไปนี้
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) ) }) }
ตัวสร้าง DragAndDropTransferData
จะยอมรับอาร์กิวเมนต์ flags
เพื่อให้การดำเนินการลากข้ามขอบเขตของแอปได้ ในตัวอย่างต่อไปนี้ ค่าคงที่ DRAG_FLAG_GLOBAL
จะระบุว่าสามารถลากข้อมูลจากแอปหนึ่งไปยังอีกแอปหนึ่งได้
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ), flags = View.DRAG_FLAG_GLOBAL ) ) }) }
DragAndDropTransferData
ยอมรับแฟล็กที่ระบบ Android View รองรับ
ดูรายการค่าคงที่ View สำหรับรายการ Flag ทั้งหมดที่ใช้ได้
รับข้อมูลการเปิดตัว
กำหนดตัวแก้ไข dragAndDropTarget
ให้กับ Composable เพื่อเปิดใช้ Composable เพื่อรับเหตุการณ์แบบลากและวาง ตัวแก้ไขมี 2 พารามิเตอร์ ได้แก่ พารามิเตอร์แรกทำหน้าที่เป็นตัวกรองและระบุประเภทข้อมูลที่ตัวแก้ไขยอมรับได้ และพารามิเตอร์ที่ 2 จะส่งข้อมูลใน Callback
โปรดทราบว่าคุณควรจำอินสแตนซ์ Callback ไว้ ข้อมูลโค้ดต่อไปนี้แสดงวิธีจดจำการเรียกกลับ
val callback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { // Parse received data return true } } }
ตัวอย่างถัดไปแสดงวิธีจัดการข้อความธรรมดาที่ตกหล่น
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = callback )
ฟังก์ชัน Callback ควรแสดงผล true
หากใช้เหตุการณ์ หรือ false
หากเหตุการณ์ถูกปฏิเสธและไม่เผยแพร่ไปยังคอมโพเนนต์หลัก
จัดการเหตุการณ์แบบลากและวาง
ลบล้าง Callback ในอินเทอร์เฟซ DragAndDropTarget
เพื่อสังเกตเมื่อเหตุการณ์การลากและวางเริ่มต้น สิ้นสุด หรือเข้าหรือออกจากคอมโพเนนต์เพื่อการควบคุม UI และลักษณะการทำงานของแอปได้อย่างแม่นยำ
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 }
แหล่งข้อมูลเพิ่มเติม
Codelab: ลากและวางในการเขียน