考虑到子组件不是一个选项,使用 react-native-reanimated 为一组对象设置动画的正确方法是什么?
What is the proper way to animate an array of objects with react-native-reanimated, considering a sub-component is not an option?
我正在尝试使用 react-native-reanimated
v2 为 Animated.View
数组设置动画。
对于我来说,有两个障碍:
- 对象最终会相互动画。因此,我无法为每个可拖动对象生成新的子组件。 (如果我尝试这样做,子组件之间的信号可能会很糟糕。)
- Rules of Hooks 禁止在循环或其他函数中使用钩子。 (但据我所知,这就是我所需要的。)
我做了一个点心来说明我在这里尝试实现的目标(请注意,其中一个盒子可以在这里移动另一个盒子):
https://snack.expo.dev/@mehmetkaplan/react-native-reanimated-array-animation
不过我猜是因为上面第2条,snack的表现不太一致,有时候拖动没有反应。 (点心的single box version响应顺畅多了。)
回到主要问题。考虑到子组件不是一个选项,使用 react-native-reanimated
为对象数组设置动画的正确方法是什么?
如有任何建议,我们将不胜感激。
在循环中使用钩子
绝对不是什么值得骄傲的事情,但只要 use...
调用的顺序不受影响并且所有逻辑都发生在调用之后就可以了。这意味着在组件的生命周期中,循环中的迭代次数不应改变。
基本上调用所有钩子的顺序应该始终相同。
行为不一致
确保您的 PanGestureHandler
包装 Animated.View
组件,否则它将无法在移动设备上运行。
除了奇怪的拖动手柄(仅适用于 Text
)并在移动设备上损坏。我无法发现行为中的任何不一致之处。将整个 Animated.View
嵌套在 PanGestureHandler
中可以解决这两个问题,
<PanGestureHandler onGestureEvent={gestureHandlers[i]}>
<Animated.View style={[styles.box, animatedStyles[i]]} key={`View-${i}`}>
<Text style={{color: "#FFFF00", fontWeight:'bold'}}>{`I am the box #${i}\nDrag Me${i === 1 ? "(I move also Box 0)" : ""}`}</Text>
</Animated.View>
</PanGestureHandler>
这是一个工作示例,
我正在尝试使用 react-native-reanimated
v2 为 Animated.View
数组设置动画。
对于我来说,有两个障碍:
- 对象最终会相互动画。因此,我无法为每个可拖动对象生成新的子组件。 (如果我尝试这样做,子组件之间的信号可能会很糟糕。)
- Rules of Hooks 禁止在循环或其他函数中使用钩子。 (但据我所知,这就是我所需要的。)
我做了一个点心来说明我在这里尝试实现的目标(请注意,其中一个盒子可以在这里移动另一个盒子): https://snack.expo.dev/@mehmetkaplan/react-native-reanimated-array-animation
不过我猜是因为上面第2条,snack的表现不太一致,有时候拖动没有反应。 (点心的single box version响应顺畅多了。)
回到主要问题。考虑到子组件不是一个选项,使用 react-native-reanimated
为对象数组设置动画的正确方法是什么?
如有任何建议,我们将不胜感激。
在循环中使用钩子
绝对不是什么值得骄傲的事情,但只要 use...
调用的顺序不受影响并且所有逻辑都发生在调用之后就可以了。这意味着在组件的生命周期中,循环中的迭代次数不应改变。
基本上调用所有钩子的顺序应该始终相同。
行为不一致
确保您的 PanGestureHandler
包装 Animated.View
组件,否则它将无法在移动设备上运行。
除了奇怪的拖动手柄(仅适用于 Text
)并在移动设备上损坏。我无法发现行为中的任何不一致之处。将整个 Animated.View
嵌套在 PanGestureHandler
中可以解决这两个问题,
<PanGestureHandler onGestureEvent={gestureHandlers[i]}>
<Animated.View style={[styles.box, animatedStyles[i]]} key={`View-${i}`}>
<Text style={{color: "#FFFF00", fontWeight:'bold'}}>{`I am the box #${i}\nDrag Me${i === 1 ? "(I move also Box 0)" : ""}`}</Text>
</Animated.View>
</PanGestureHandler>
这是一个工作示例,