awaitVerticalDragOrCancellation
Function
Common
suspend fun AwaitPointerEventScope.awaitVerticalDragOrCancellation(
pointerId: PointerId
): PointerInputChange?
Reads pointer input events until a vertical drag is detected or all pointers are up. When the
final pointer is raised, the up event is returned. When a drag event is detected, the drag change
will be returned. Note that if pointerId has been raised, another pointer that is down will be
used, if available, so the returned PointerInputChange.id may differ from pointerId. If the
position change has been consumed by the PointerEventPass.Main pass, then the drag is
considered canceled and null is returned. If pointerId is not down when
awaitVerticalDragOrCancellation is called, then null is returned.
Example Usage:
Code Examples
AwaitVerticalDragOrCancellationSample
@Composable
fun AwaitVerticalDragOrCancellationSample() {
val offsetX = remember { mutableStateOf(0f) }
val offsetY = remember { mutableStateOf(0f) }
var height by remember { mutableStateOf(0f) }
Box(Modifier.fillMaxSize().onSizeChanged { height = it.height.toFloat() }) {
Box(
Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
.fillMaxWidth()
.height(50.dp)
.background(Color.Blue)
.pointerInput(Unit) {
awaitEachGesture {
val down = awaitFirstDown()
var change =
awaitVerticalTouchSlopOrCancellation(down.id) { change, over ->
val originalY = offsetY.value
val newValue =
(originalY + over).coerceIn(0f, height - 50.dp.toPx())
change.consume()
offsetY.value = newValue
}
while (change != null && change.pressed) {
change = awaitVerticalDragOrCancellation(change.id)
if (change != null && change.pressed) {
val originalY = offsetY.value
val newValue =
(originalY + change.positionChange().y).coerceIn(
0f,
height - 50.dp.toPx(),
)
change.consume()
offsetY.value = newValue
}
}
}
}
)
}
}
