【发布时间】:2021-04-23 18:30:55
【问题描述】:
我尝试制作一个无限循环的脉冲动画视图。以下视图实现了该动画。但我想在动画时更新动画持续时间。实际上它不会更新循环动画。向 useEffect 依赖项添加持续时间无法正常工作,因为它会刷新当前动画圆圈。
喜欢这个(Source):
这是我当前的代码:
const LoopPulseView = (props: {duration: number;}) => {
const nbPulse = 6;
const [pulses, setPulses] = useState([] as any);
const [duration, setDuration] = useState(props.duration);
const [delay] = useState(duration / nbPulse);
useEffect(() => {
setDuration(props.duration);
}, [props.duration]);
const scaleOut = {
0: {
opacity: 1,
scale: 1,
},
1: {
opacity: 0,
scale: 1.5,
},
};
useEffect(() => {
const newPulses = [];
for (let p = 0; p < nbPulse; p++) {
const view = (
<Animatable.View
key={p}
duration={duration}
delay={delay * p}
style={[styles.pulse, pulseStyle]}
animation={scaleOut}
iterationCount={'infinite'}
useNativeDriver={true}
/>
);
newPulses.push(view);
}
setPulses(newPulses);
}, []);
return (
<View style={containerStyle}>
<View style={pulseWrapperStyle}>
{pulses.map((pulse: any) => {
return pulse;
})}
</View>
</View>
);
};
export default LoopPulseView;
【问题讨论】:
-
如果你添加 'duration' 作为你的 useEffect 的依赖,它会在修改时长时重新启动
-
您正在从道具访问持续时间,并且您正在将其与状态一起使用。这是不行的。你不需要这一行: const [duration, setDuration] = useState(props.duration);
-
@Kai 是的,但它会重置动画,即使它正在运行,它也不流畅
-
@Arbnor 是的,你说得对
-
@Ludovic 您需要使用
transitionTo命令式方法才能更改持续时间。但是,我认为您会从切换动画持续时间中发现一些不需要的副作用。在这里查看更多docs 你应该尝试使用react-native-reanimated从头开始实现这个动画。你会发现这样你有更多的灵活性/
标签: react-native react-animated react-native-animatable