detectHorizontalDragGestures
suspend fun PointerInputScope.detectHorizontalDragGestures(
onDragStart: (Offset) -> Unit = {},
onDragEnd: () -> Unit = {},
onDragCancel: () -> Unit = {},
onHorizontalDrag: (change: PointerInputChange, dragAmount: Float) -> Unit,
)
Gesture detector that waits for pointer down and touch slop in the horizontal direction and then
calls onHorizontalDrag for each horizontal drag event. It follows the touch slop detection of
awaitHorizontalTouchSlopOrCancellation, but will consume the position change automatically once
the touch slop has been crossed.
onDragStart called when the touch slop has been passed 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 gesture detector will coordinate with detectVerticalDragGestures and
awaitVerticalTouchSlopOrCancellation to ensure only vertical or horizontal dragging is locked,
but not both.
Example Usage:
Code Examples
DetectHorizontalDragGesturesSample
@Composable
fun DetectHorizontalDragGesturesSample() {
val offsetX = remember { mutableStateOf(0f) }
val offsetY = remember { mutableStateOf(0f) }
var width by remember { mutableStateOf(0f) }
Box(Modifier.fillMaxSize().onSizeChanged { width = it.width.toFloat() }) {
Box(
Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
.fillMaxHeight()
.width(50.dp)
.background(Color.Blue)
.pointerInput(Unit) {
detectHorizontalDragGestures { _, dragAmount ->
val originalX = offsetX.value
val newValue = (originalX + dragAmount).coerceIn(0f, width - 50.dp.toPx())
offsetX.value = newValue
}
}
)
}
}
