返回

如何在 Flutter 中重置滑动检测以停止小组件动画?

Android

在 Flutter 中重置滑动检测以停止小组件动画

问题:

在 Flutter 中使用 detectHorizontalDragGestures 修饰符时,当用户手指离开屏幕时,小组件会自动滑动回其原始位置。但是在某些情况下,你可能希望在用户手指滑出小组件时停止动画。

解决方法:

1. 监听 dismissLeftdismissRight 状态

detectHorizontalDragGestures 修饰符会触发 dismissLeftdismissRight 状态,表示小组件已达到滑动阈值。监听这些状态的变化,并在触发时重置滑动检测。

2. 重置 offset 状态

offset 状态跟踪小组件的当前水平偏移量。要重置动画,在 dismissLeftdismissRight 触发时将 offset 状态重置为 0。

代码示例

将以下代码添加到你的 Card 小组件中:

LaunchedEffect(dismissLeft) {
    offset = 0f
}

LaunchedEffect(dismissRight) {
    offset = 0f
}

完整代码

Card(
    modifier = Modifier
        .offset { IntOffset(offset.roundToInt(), 0) }
        .pointerInput(Unit) {
            detectHorizontalDragGestures(
                onDragEnd = { offset = 0f },
                onHorizontalDrag = { change, dragAmount ->
                    offset += (dragAmount / density) * sensitivityFactor
                    when {
                        offset > swipeThreshold -> dismissRight = true
                        offset < -swipeThreshold -> dismissLeft = true
                    }
                    if (change.positionChange() != Offset.Zero) change.consume()
                }
            )
        }
) {}

通过这些步骤,你可以重置滑动检测并在用户手指滑出小组件时停止动画。

常见问题解答

1. 我应该在何时重置滑动检测?
当希望在用户手指滑出小组件时停止动画时,应该重置滑动检测。

2. 我可以使用其他方法来重置滑动检测吗?
除了监听 dismissLeftdismissRight 状态外,你还可以使用 cancelDrag() 方法来强制取消拖动手势,从而重置滑动检测。

3. 是否可以只禁用滑动动画而不重置滑动检测?
是,你可以使用 draggable() 修饰符并设置 dragStartThreshold 参数为 double.infinity 来禁用滑动动画。

4. 重置滑动检测会对其他小组件产生影响吗?
重置滑动检测只会影响使用相同 detectHorizontalDragGestures 修饰符的小组件。

5. 如何在不同方向上重置滑动检测?
你可以使用 detectVerticalDragGestures 修饰符来检测垂直拖动手势,并按照同样的步骤重置滑动检测。