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
}
}
}
}
)
}
}