Build Drag Data
build a ClipData and specify an Intent, to deliver data that you want post on drop
val intent = Intent()
val data = ClipData.newIntent("CustomDragType", intent)
Start Drag
val shadow = DragShadowBuilder(view)
view.startDragAndDrop(data, shadow, null, 0)
Response DragAndDrop Event
there are two ways to drop an element
- drop onto a view
- drop into blank spaces between serveral views
in case 1, you can use the target view responsing drop event
in case 2, you can use a common parent view responsing drop event
then decide which child to handle event, by comparing event’s coordinate to view’s coordinate
dropView.setOnDragListener { v, event ->if (event.action == DragEvent.ACTION_DRAG_ENDED) {val point = Point(event.x.toInt(), event.y.toInt())val data = event.clipData.getItemAt(0).intenthandleDropEvent(v, point, data)dragView.cancelDragAndDrop()}return@setOnDragListener true
}
Utils
fun DragEvent.name() = when (action) {ACTION_DRAG_STARTED -> "START"ACTION_DRAG_ENTERED -> "ENTER"ACTION_DRAG_LOCATION -> "LOCATION"ACTION_DRAG_EXITED -> "EXIT"ACTION_DROP -> "DROP"ACTION_DRAG_ENDED -> "END"else -> "NONE"
}fun DragEvent.info() = "${name()} $x $y"