Как остановить циклическую анимацию в React Native?
У меня есть простая анимация цикла в моем компоненте, как это:
runAnimation() {
console.log('run animation');
this.state.angle.setValue(0);
Animated.timing(this.state.angle, {
toValue: 360,
duration: 8000,
easing: Easing.linear
}).start(() => this.runAnimation());
}
...
<Animated.Image
style={[
styles.rotate,
{ transform: [
{ rotate: this.state.angle.interpolate({
inputRange: [0, 360],
outputRange: ['0deg', '360deg']
})},
]}
]}
source={require('./spinning_ball.png')}
/>
Как бы я остановил эту анимацию? Например, при переходе на другой экран или после того, как пользователь нажимает на кнопку.
Я попробовал использовать это.государство.угол.stopAnimation () но заметил, что запуск анимации все еще печатается в консоли. Существует ли другой метод остановки, который я должен вызывать, чтобы предотвратить выполнение обратного вызова start?
3 ответов:
На основе моего комментария в ответе Нгуен Хоанга. Вот еще один способ остановить циклическую анимацию, если вы вызовете
this.state.angle.stopAnimation():runAnimation() { this.state.angle.setValue(0); Animated.timing(this.state.angle, { toValue: 360, duration: 8000, easing: Easing.linear }).start((o) => { if(o.finished) { this.runAnimation(); } }); }
Вы можете создать переменную
stopAnimation, чтобы остановить анимацию, когда захотите, только когдаstopAnimation === falseзатем вызовите функциюrunAnimation. Например:Поэтому вам просто нужно создать кнопку, которая вызовет функциюthis.state = { stopAnimation: false } runAnimation() { this.state.spinValue.setValue(0); Animated.timing( this.state.spinValue, { toValue: 1, duration: 3000, easing: Easing.linear } ).start( () => { if(this.state.stopAnimation === false) { this.runAnimation(); } }); }this.state = { stopAnimation: true }, чтобы остановить анимацию.Пример здесь: https://rnplay.org/apps/Lpmh8A .
Установите глобальную переменную
let dataloaded = false;Чтобы остановить анимацию, переопределите переменную (dataloaded) всякий раз, когда вы хотите
componentWillUnmount() { dataloaded = true; } onPress={() => { dataloaded = true; }}Окончательный код будет выглядеть так:
runAnimation() { console.log('run animation'); this.state.angle.setValue(0); Animated.timing(this.state.angle, { toValue: 360, duration: 8000, easing: Easing.linear }) .start(() => { if ( ! dataloaded) { this.runAnimation(); } }) }
Comments