ลากและวาง

Jetpack Compose รองรับการลากและวางด้วยแป้นกดร่วม 2 แบบดังนี้

  • dragAndDropSource: ระบุ Composable เป็นจุดเริ่มต้นของท่าทางสัมผัสการลาก
  • dragAndDropTarget: ระบุ Composable ที่ยอมรับข้อมูลที่ทิ้ง

เช่น ถ้าต้องการให้ผู้ใช้ลากรูปภาพในแอป ให้สร้างรูปภาพ Composable และเพิ่มตัวแก้ไข dragAndDropSource หากต้องการสร้างเป้าหมายแบบเลื่อนลง ให้สร้างอีกเป้าหมายหนึ่ง รูปภาพ Composable และเพิ่มแป้นกดร่วม dragAndDropTarget

ตัวแก้ไขใช้ได้กับแหล่งที่มาของการลากหลายรายการและเป้าหมายการปล่อยหลายรายการ

ตัวแก้ไขช่วยให้แอปแชร์ข้อมูลระหว่าง Composable ตั้งแต่ 2 รายการขึ้นไป โดยใช้ ClipData ซึ่งทำงานร่วมกับการติดตั้งใช้งาน View ได้

เริ่มเหตุการณ์การลาก

หากต้องการเปิดใช้เหตุการณ์การลากภายในคอมโพเนนต์ ให้เพิ่มตัวแก้ไข dragAndDropSource ซึ่งจะใช้ฟังก์ชันการระงับเป็นพารามิเตอร์ ฟังก์ชันจะกำหนดผู้ใช้ การโต้ตอบที่เริ่มต้นการดำเนินการลาก แป้นกดร่วม dragAndDropSource รอจนกว่าจะได้รับเหตุการณ์อินพุตตัวชี้แล้วจึงเรียกใช้แลมบ์ดา ที่ส่งไปยังเครื่องจัดการเหตุการณ์ ใช้ lambda เพื่อตรวจจับเหตุการณ์อินพุตต่างๆ เช่น การแตะหรือกดค้าง ดูข้อมูลเพิ่มเติมได้ที่ตัวชี้ ในการเขียน

เหตุการณ์อินพุตตัวชี้มักจะเป็นการกดค้างดังต่อไปนี้

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

หากต้องการเริ่มเซสชันลากและวาง ให้เรียกใช้ฟังก์ชัน startTransfer() ภายในขอบเขตนี้ ให้ใช้ 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 จะส่งข้อมูลใน 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: ลากและวางในการเขียน