Build apps faster with our new App builder! Check it out →

dragAndDropSource

Common
Android

Modifier in Compose Foundation

A [Modifier] that allows an element it is applied to be treated like a source for drag and drop operations. It displays the element dragged as a drag shadow.

Last updated:

Installation

dependencies {
   implementation("androidx.compose.foundation:foundation:1.8.0-alpha04")
}

Overloads


fun Modifier.dragAndDropSource(transferData: (Offset) -> DragAndDropTransferData?): Modifier

Parameters

namedescription
transferDataA function that receives the current offset of the drag operation and returns the [DragAndDropTransferData] to be transferred. If null is returned, the drag and drop transfer won't be started.

fun Modifier.dragAndDropSource(
    drawDragDecoration: DrawScope.() -> Unit,
    transferData: (Offset) -> DragAndDropTransferData?
): Modifier

Parameters

namedescription
drawDragDecorationprovides the visual representation of the item dragged during the drag and drop gesture.
transferDataA function that receives the current offset of the drag operation and returns the [DragAndDropTransferData] to be transferred. If null is returned, the drag and drop transfer won't be started.
@Deprecated(
    message =
        "Replaced by overload with a callback for obtain a transfer data," +
            "start detection is performed by Compose itself",
    replaceWith = ReplaceWith("Modifier.dragAndDropSource(transferData)")
)
@ExperimentalFoundationApi
fun Modifier.dragAndDropSource(block: suspend DragAndDropSourceScope.() -> Unit): Modifier

Parameters

namedescription
blockA lambda with a [DragAndDropSourceScope] as a receiver which provides a [PointerInputScope] to detect the drag gesture, after which a drag and drop gesture can be started with [DragAndDropSourceScope.startTransfer].
@Deprecated(
    message =
        "Replaced by overload with a callback for obtain a transfer data," +
            "start detection is performed by Compose itself",
    replaceWith = ReplaceWith("Modifier.dragAndDropSource(transferData)")
)
@ExperimentalFoundationApi
fun Modifier.dragAndDropSource(
    drawDragDecoration: DrawScope.() -> Unit,
    block: suspend DragAndDropSourceScope.() -> Unit
): Modifier

Parameters

namedescription
drawDragDecorationprovides the visual representation of the item dragged during the drag and drop gesture.
blockA lambda with a [DragAndDropSourceScope] as a receiver which provides a [PointerInputScope] to detect the drag gesture, after which a drag and drop gesture can be started with [DragAndDropSourceScope.startTransfer].

Code Examples

TextDragAndDropSourceSample

@Composable
fun TextDragAndDropSourceSample(modifier: Modifier) {
    val label = remember { "Drag me" }
    Box(
        modifier =
            modifier
                .dragAndDropSource { _ ->
                    DragAndDropTransferData(
                        clipData = ClipData.newPlainText(label, label),
                        flags = View.DRAG_FLAG_GLOBAL,
                    )
                }
                .border(
                    border =
                        BorderStroke(
                            width = 4.dp,
                            brush = Brush.linearGradient(listOf(Color.Magenta, Color.Magenta))
                        ),
                    shape = RoundedCornerShape(16.dp)
                )
                .padding(24.dp),
    ) {
        Text(modifier = Modifier.align(Alignment.Center), text = label)
    }
}

DragAndDropSourceWithColoredDragShadowSample

@Composable
fun DragAndDropSourceWithColoredDragShadowSample(color: Color) {
    Box(
        modifier =
            Modifier.size(56.dp).background(color = color).dragAndDropSource(
                drawDragDecoration = { drawRect(color) },
            ) { _ ->
                color.toDragAndDropTransfer()
            }
    )
}
by @alexstyl