web-dev-qa-db-fra.com

React Native Animated pour redimensionner une image

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:

enter image description here

Je ne trouve aucune documentation à ce sujet. Comment utiliser la propriété transform.

Merci beaucoup.

4
Somename

Je pense que c'est ce que vous voulez:

enter image description here

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:

  1. 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]

  2. Même raison pour laquelle la plage de sortie de y est [0, 25]

  3. la largeur est maintenant 300 par rapport à avant 20, lequel est 15 fois plus grand

  4. la hauteur est maintenant 250 par rapport à avant 20, lequel est 12.5 fois plus grand

24
K.Wu