2016-05-25 15 views
9

Die Rotation wird eine Art transformieren und in RN, können Sie Dinge wie dieseNative reagieren: Wie animieren Sie die Rotation eines Bildes?

render() { 
    return (
     <View style={{transform:[{rotate: '10 deg'}]}}> 
     <Image source={require('./logo.png')} /> 
     </View> 
    ); 
    } 

jedoch drehen, die Dinge in RN zu animieren, müssen Sie Zahlen verwenden, keine Strings. Kannst du Transformationen in RN animieren oder muss ich eine Art Sprite Sheet erstellen und den Image src um einige fps ändern?

Antwort

46

Sie können Strings tatsächlich mit der interpolate-Methode animieren. interpolate nimmt einen Bereich von Werten, typischerweise 0 bis 1 funktioniert für die meisten Dinge gut und interpoliert sie in eine Reihe von Werten (das können Strings, Zahlen, sogar Funktionen sein, die einen Wert zurückgeben).

Was würden Sie tun, ist nehmen einen vorhandenen Animations Wert und geben es durch die Interpolations-Funktion wie folgt aus:

// First set up animation 
Animated.timing(
    this.state.spinValue, 
    { 
    toValue: 1, 
    duration: 3000, 
    easing: Easing.linear 
    } 
).start() 

// Second interpolate beginning and end values (in this case 0 and 1) 
const spin = this.state.spinValue.interpolate({ 
    inputRange: [0, 1], 
    outputRange: ['0deg', '360deg'] 
}) 

Dann in Ihrer Komponente wie folgt verwenden es:

<Animated.Image 
    style={{transform: [{rotate: spin}] }} 
    source={{uri: 'somesource.png'}} /> 
+3

Das ist ein gutes Beispiel ist. Schön gemacht. – zipzit

+0

Hey, ich schätze den Kommentar. Vielen Dank! –

+0

Schön! Einfach und direkt auf den Punkt! Wie können Sie wissen, dass start() in Ihrem Beispielbeispiel einen Rückruf annehmen kann? Ich kann die Dokumente dafür auf der RN-Website von Facebook nicht finden. –

14

Leider nicht genug Ruf, um oben zu kommentieren.

Sehr gutes Beispiel. Vergessen Sie nicht, Eigentum useNativeDriver, um sicherzustellen, hinzuzufügen, dass Sie die beste Leistung erhalten aus dieser Animation:

// First set up animation 
Animated.timing(
    this.state.spinValue, 
    { 
    toValue: 1, 
    duration: 3000, 
    easing: Easing.linear, 
    useNativeDriver: true 
    } 
).start();