android - Compose SwipeToDismiss 确认状态更改仅适用 >= 阈值

标签 android android-jetpack-compose

我有一个 SwipeToDismiss 实例来删除 dismissThresholds 75% 的项目。 如果用户滑动行太快而未达到 75% 阈值,则行将被删除。如何防止这种情况发生?

这是我执行操作的代码:

val dismissState = rememberDismissState(
  confirmStateChange = {
    if (it == DismissValue.DismissedToStart) {
      viewModel.deleteCity(city)
    }
    true
  }
)

最佳答案

我遇到了同样的问题,并找到了适合我的修复方法。我的理论是,当滑动速度非常快但没有走很远(没有达到设置的分数阈值)时,布局会立即重置。在本例中 (DismissToStart),意味着 View 弹回屏幕右侧边缘,为我们提供阈值 1.0f,从而触发确认状态更改,因为根据定义,该分数高于我们的阈值。问题是我们的阈值是从右屏幕边缘测量的,而这个分数(在我的理论中)是从左屏幕边缘测量的。

所以我的解决方案是跟踪当前的小数值,并在 confirmStateChange 中检查当前值是否高于阈值,但不是 1.0f。在现实世界中,我认为实际从右向左滑动手指不可能达到 1.0,因此该解决方案对我来说似乎是安全的。

val dismissThreshold = 0.25f
val currentFraction = remember { mutableStateOf(0f) }

val dismissState = rememberDismissState(
    confirmStateChange = {
        if (it == DismissValue.DismissedToStart) {
            if (currentFraction.value >= dismissThreshold && currentFraction.value < 1.0f) {
                onSwiped(item)
            }
        }
        dismissOnSwipe
    }
)

SwipeToDismiss(
    state = dismissState,
    modifier = Modifier.animateItemPlacement(),
    directions = setOf(DismissDirection.EndToStart),
    dismissThresholds = { direction ->
        FractionalThreshold(dismissThreshold)
    },
    background = {
        Box(...) {
            currentFraction.value = dismissState.progress.fraction
            ...
        }
    }
    dismissContent = {...}
)

关于android - Compose SwipeToDismiss 确认状态更改仅适用 >= 阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72676541/

相关文章:

kotlin - 我正在尝试使用 Jetpack Compose 在 Android 中设置背景图片,但图片无法填满整个页面

android - 以编程方式添加相对于另一个 ImageView 的 ImageView (Android)

android - Android Jetpack Compose 导航中的依赖性问题

android - Jetpack Compose 中的 "View.onTouchListener"等效项是什么?我需要触摸坐标

android - 仅隐藏滚动而不是操作栏选项卡上的操作栏

android - Jetpack Compose Text 超链接部分文本

android - 如何在 Android Compose TextField 的虚拟键盘上启用大写?

android - Android 上的双文本 TextView

android - Material 日期选择器选择的日期圈不在中心,如何使其适合中心?

java - setOnItemClickListener() 不适用于 Fragment 中的 ExpandableHeightGridView