SwipeToDismiss PositionalThreshold игнорируется и выполняется действие, когда пользователь поднимает палецAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 SwipeToDismiss PositionalThreshold игнорируется и выполняется действие, когда пользователь поднимает палец

Сообщение Anonymous »

Я реализую SwipeToDismissBox с помощью Jetpack Compose Material 3. У меня есть два конкретных требования:
  • Пользовательский порог: действие смахивания должно запускаться, когда пользователь перетаскивает более 25 % ширины.
  • Время действия: функция (onRemove и onArchive) не должна выполняться немедленно при достижении порога пересек. Вместо этого ему следует подождать, пока пользователь не поднимет палец, анимация «отклонения» завершится и фон полностью не откроется.
В настоящее время, несмотря на установку позиционного порога на 0,25f, currentValue не меняется (и, следовательно, мой LaunchedEffect не срабатывает), пока я не перетащу хотя бы 50% ширины. Пользовательский порог, похоже, игнорируется.
Кроме того, я не уверен, как правильно обрабатывать поток анимации к действию. При попытке вызвать 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")
}
}
}
Я не использую параметр onConfirmValue для RememberSwipeToDismissState, поскольку он устарел (версия моей библиотеки: composeBom = "2025.10.01")

Подробнее здесь: https://stackoverflow.com/questions/798 ... -user-lift
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»