---
title: "detectDragGesturesAfterLongPress"
description: "Gesture detector that waits for pointer down and long press, after which it calls [onDrag] for
each drag event.

[onDragStart] called when a long press is detected and includes an [Offset] representing the last
known pointer position relative to the containing element. The [Offset] can be outside the actual
bounds of the element itself meaning the numbers can be negative or larger than the element
bounds if the touch target is smaller than the [ViewConfiguration.minimumTouchTargetSize].

[onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
has consumed pointer input, canceling this gesture. This function will automatically consume all
the position change after the long press.

Example Usage:"
type: "function"
---

<div class='type'>Function</div>


<a id='references'></a>
<div class='sourceset sourceset-common'>Common</div>


```kotlin
suspend fun PointerInputScope.detectDragGesturesAfterLongPress(
    onDragStart: (Offset) -> Unit = {},
    onDragEnd: () -> Unit = {},
    onDragCancel: () -> Unit = {},
    onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit,
)
```


Gesture detector that waits for pointer down and long press, after which it calls `onDrag` for
each drag event.

`onDragStart` called when a long press is detected and includes an `Offset` representing the last
known pointer position relative to the containing element. The `Offset` can be outside the actual
bounds of the element itself meaning the numbers can be negative or larger than the element
bounds if the touch target is smaller than the `ViewConfiguration.minimumTouchTargetSize`.

`onDragEnd` is called after all pointers are up and `onDragCancel` is called if another gesture
has consumed pointer input, canceling this gesture. This function will automatically consume all
the position change after the long press.

Example Usage:



## Code Examples
### DetectDragWithLongPressGesturesSample
```kotlin
@Composable
fun DetectDragWithLongPressGesturesSample() {
    val offsetX = remember { mutableStateOf(0f) }
    val offsetY = remember { mutableStateOf(0f) }
    var size by remember { mutableStateOf(Size.Zero) }
    Box(Modifier.fillMaxSize().onSizeChanged { size = it.toSize() }) {
        Box(
            Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                .size(50.dp)
                .background(Color.Blue)
                .pointerInput(Unit) {
                    detectDragGesturesAfterLongPress { _, dragAmount ->
                        val original = Offset(offsetX.value, offsetY.value)
                        val summed = original + dragAmount
                        val newValue =
                            Offset(
                                x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
                                y = summed.y.coerceIn(0f, size.height - 50.dp.toPx()),
                            )
                        offsetX.value = newValue.x
                        offsetY.value = newValue.y
                    }
                }
        )
    }
}
```

