2015-07-23 4 views
17

React-native Einführung neue Animated API, möchte ich eine Schleife Animation wie eine Blase zu vergrößern, dann skalieren und wiederholen Sie diesen Fortschritt.Wiederholen Sie die Animation mit neuen animierten API

Allerdings kann ich es nicht herausfinden. Ich habe versucht, schreiben einige Code wie unten

class TestProject extends React.Component { 

    constructor(): void { 
    super(); 
    this.state = { 
     bounceValue: new Animated.Value(0), 
     v: 1, 
    }; 
    } 

    componentDidMount() { 
    this.state.bounceValue.setValue(1.5); 

    let animation = Animated.timing(this.state.bounceValue, { 
     toValue: this.state.v, 
    }); 

    setInterval(() => { 
     animation.stop(); 

     if (this.state.flag) { 
     this.state.v = 0.5; 
     this.state.bounceValue.setValue(0.5); 
     } 
     else { 
     this.state.v = 1.5; 
     this.state.bounceValue.setValue(1.5); 
     } 

     animation.start(); 
    }, 5000); 

    } 

    render(): ReactElement { 
    return (
     <View style={styles.imageContainer}> 
     <Image 
      style={styles.image} 
      source={{uri: 'http://image142-c.poco.cn/best_pocoers/20130517/91062013051716553599334223.jpg'}} 
     /> 
     <Animated.Text 
      style={[ 
      styles.test, 
      {transform: [ 
       {scale: this.state.bounceValue}, 
      ],} 
      ] 
      }> 
      haha 
     </Animated.Text> 
     </View> 
    ); 
    } 

} 

aber funktioniert nicht sehr gut.

Jeder Vorschlag wird zu schätzen wissen.

Antwort

24

Ich verwende die Sequenzverfahren ein Array von Animationen zu Zyklus passieren und dann die Funktion wiederholen.

//this.state.animatedStartValue = 0; 

function cycleAnimation() { 
    Animated.sequence([ 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 1, 
     duration: 500, 
     delay: 1000 
    }), 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 0, 
     duration: 500 
    }) 
    ]).start(() => { 
    cycleAnimation(); 
    }); 
} 

Wenn ich diese Animation Makeln auf seine eigene wird es verblassen in/out, aber ich es oben auf einer Basisschicht

<TouchableOpacity> 
    <Animated.Image 
     source={activeImageSource} 
     style={this.state.animatedStartValue}} 
    /> 
    <Image source={nonActiveImageSource} 
    /> 
    </TouchableOpacity> 

einen aktiven Zustand oder Hotspot-Stil-Taste zu imitieren React Native Sequence Documentation

+1

vor dem Schleifen sollten Sie überprüfen, ob die Animation beendet oder abgebrochen wurde, sonst können Sie sie nie stoppen. Siehe meine Antwort unten: http://stackoverflow.com/questions/31578069/repeat-animation-with-new-animated-api/38393479#38393479 – joshblour

+0

Finden Sie Silyjewsks Antwort. Das ist veraltet. –

+0

Sie können auch this.state.yourAnimation.stopAnimation() verwenden, wenn Sie componentWillUnmount –

0

Es scheint, dass "Looping" von der Animated API für jetzt nicht unterstützt wird.

Ich habe das geschafft, indem ich die Animation erneut starte, wenn sie fertig ist.

startAnimation() { 
    Animated.timing(this._animatedValue, { 
    toValue: 100, 
    duration: 1000, 
    }).start(() => { 
    this.startAnimation(); 
    }); 
} 

enter image description here

freuen uns auf eine bessere Lösung ...

0

Sie eine andere Animation einstellen können dann wieder die Animation nennen:

Ein Beispiel I Text tat zu verblassen und -Ausgang:

textAnimate: function() { 
    Animated.timing(
     this.state.textOpacity, 
     { 
     toValue: 0.3,       
     duration: 500, 
     } 
    ).start(() => { 
     Animated.timing( 
     this.state.textOpacity,    
     { 
      toValue: 1,      
      duration: 500,   
     } 
    ).start(() => { 
      this.textAnimate(); 
     }); 
    });  
    }, 

    componentDidMount: function() { 
    this.state.textOpacity.setValue(1) 
    this.textAnimate(); 
    }, 
16

verbesserte Version von @bcomerford Antwort

//this.state.animatedStartValue = 0; 

function cycleAnimation() { 
    Animated.sequence([ 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 1, 
     duration: 500, 
     delay: 1000 
    }), 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 0, 
     duration: 500 
    }) 
    ]).start(event => { 
    if (event.finished) { 
     cycleAnimation(); 
    } 
    }); 
} 
45

Es gibt jetzt loop animation verfügbar:

Animated.loop(
    Animated.sequence([ 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 1, 
     duration: 500, 
     delay: 1000 
    }), 
    Animated.timing(this.state.animatedStartValue, { 
     toValue: 0, 
     duration: 500 
    }) 
    ]), 
    { 
    iterations: 4 
    } 
).start() 
+5

Dies sollte die akzeptierte Antwort sein. Keine Hacks hier. –

+0

@AnshulKoka Ich dachte genau das Lesen der akzeptierten Antwort. – rodrigoelp

+0

Sie können keinen Rückruf am Ende der Schleife obwohl – Herno

1

so etwas wie dieses Versuchen:

componentDidMount() { 
 
    this.bootAnimation(); 
 
    } 
 

 
    bootAnimation() { 
 
    this.animation = Animated.loop(
 
     Animated.timing(this.state.progress, { 
 
     toValue: 1, 
 
     duration: 5000 
 
     }) 
 
    ).start(); 
 
    }