J'ai 2 problèmes avec l'API Animated
.
1er: Je peux montrer l'image de gauche à droite avec le code suivant. Je veux mettre l'image à l'échelle de la position X=40 (leftPadding), Y=100(topPadding), height:20, width:20
à X=20, Y=10, height:250, width:300
. Comment puis-je y parvenir?
Mon code:
import React, { Component } from 'react';
import { StyleSheet, Text, Image, Animated, Easing, View, Button } from 'react-native';
class MyTestComp extends Component {
componentWillMount() {
this.animatedValue = new Animated.Value(0);
}
buttonPress(){
this.animatedValue.setValue(0);
Animated.timing(this.animatedValue,{
toValue:1,
duration:1000,
Easing: Easing
}).start()
}
render() {
const translateX = this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [-500, 1]
})
const transform = [{translateX}];
return (
<View>
<Text>MyTestComp</Text>
<Animated.View style={transform}>
<Image
source={require('./assets/17.jpg')}
style={{width:300, height:250}}
/>
</Animated.View>
<View style={{marginTop:10}}>
<Button title="Click Me" onPress={()=> this.buttonPress()} />
</View>
</View>
);
}
}
export default MyTestComp;
2ème: Chaque fois que je lance l'animation, je reçois une exception:
Je ne trouve aucune documentation à ce sujet. Comment utiliser la propriété transform
.
Merci beaucoup.
Je pense que c'est ce que vous voulez:
L'animation est en fait très fluide, ne semble pas si dans le GIF car le GIF est de 4 images par seconde. Voici le code (puisque vos nombres sont tous des constantes, je les ai tous codés en dur dans le code ci-dessous):
import React, { Component } from 'react'
import { Animated, View, TouchableOpacity, Easing } from 'react-native'
const backgroundImage = require('....')
class App extends Component {
constructor(props) {
super(props)
this.animatedValue = new Animated.Value(0)
}
handleAnimation = () => {
Animated.timing(this.animatedValue, {
toValue: 1,
duration: 1000,
easing: Easing.ease
}).start()
}
render() {
return (
<View style={{ flex: 1 }}>
<TouchableOpacity onPress={this.handleAnimation}>
<Text>Transform</Text>
</TouchableOpacity>
<Animated.Image
source={backgroundImage}
resizeMode='cover'
style={{
position: 'absolute',
left: 40,
top: 100,
height: 20,
width: 20,
transform: [
{
translateX: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [0, 120]
})
},
{
translateY: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [0, 25]
})
},
{
scaleX: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [1, 15]
})
},
{
scaleY: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [1, 12.5]
})
}
]
}}
/>
</View>
)
}
}
export default App
Quelques explications:
Après l'animation, la largeur de l'image devient 300
, lequel est 280
pixels plus grands, car l'image évolue à partir du centre, par conséquent, la coordination x de l'image a été décalée 140
px ou -140
px, et nous voulons que la coordonnée x se déplace vers la gauche uniquement 20
px, par conséquent, nous devons le déplacer à droite 120
px, c'est pourquoi la plage de sortie de x est [0, 120]
Même raison pour laquelle la plage de sortie de y est [0, 25]
la largeur est maintenant 300
par rapport à avant 20
, lequel est 15
fois plus grand
la hauteur est maintenant 250
par rapport à avant 20
, lequel est 12.5
fois plus grand