- Пользовательский порог: действие смахивания должно запускаться, когда пользователь перетаскивает более 25 % ширины.
- Время действия: функция (onRemove и onArchive) не должна выполняться немедленно при достижении порога пересек. Вместо этого ему следует подождать, пока пользователь не поднимет палец, анимация «отклонения» завершится и фон полностью не откроется.
Кроме того, я не уверен, как правильно обрабатывать поток анимации к действию. При попытке вызвать swipeToDismissBoxState.dismiss() анимация выполняется, но функция (onRemove или onArchive) не выполняется.
Код: Выделить всё
@Composable
fun SwipeToDismissExample(
thresholdPercent: Float = 0.25f,
onRemove: () -> Unit = { println("onRemove") },
onArchive: () -> Unit = { println("onArchive") },
) {
val swipeToDismissBoxState = rememberSwipeToDismissBoxState(
positionalThreshold = { it * thresholdPercent },
)
LaunchedEffect(swipeToDismissBoxState.currentValue) {
println("SwipeToDismissBoxValue progress: ${swipeToDismissBoxState.progress}")
when (swipeToDismissBoxState.currentValue) {
SwipeToDismissBoxValue.EndToStart -> {
swipeToDismissBoxState.dismiss(SwipeToDismissBoxValue.EndToStart)
onRemove()
swipeToDismissBoxState.snapTo(SwipeToDismissBoxValue.Settled)
}
SwipeToDismissBoxValue.StartToEnd -> {
swipeToDismissBoxState.dismiss(SwipeToDismissBoxValue.StartToEnd)
onArchive()
swipeToDismissBoxState.snapTo(SwipeToDismissBoxValue.Settled)
}
SwipeToDismissBoxValue.Settled -> {}
}
}
SwipeToDismissBox(
state = swipeToDismissBoxState,
backgroundContent = { /*...*/ },
) {
Box(
modifier = Modifier.fillMaxWidth().height(50.dp).background(Color.LightGray),
contentAlignment = Alignment.Center,
) {
Text("Swipe left to remove, right to archive")
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -user-lift
Мобильная версия