79 votes

Mise à l'échelle automatique de la hauteur des images avec React Native

Dans mon application React Native, je récupère des images depuis une API avec des dimensions inconnues. Comment puis-je mettre à l'échelle automatiquement la hauteur si je connais la largeur souhaitée ?

Exemple :

J'ai réglé la largeur sur Dimensions.get('window').width . Comment régler la hauteur et garder le même ratio ?

export default class MyComponent extends Component {
  constructor(props) {
    super(props)
    this.state = {
      imgUrl: 'http://someimg.com/coolstuff.jpg'
    }
  }

  componentDidMount() {
    // sets the image url to state
    this.props.getImageFromAPi()
  }

  render() {
    return (
      <View>
        <Image 
          source={uri: this.state.imgUrl}
          style={styles.myImg}
        />
        <Text>Some description</Text>
      </View>
    )
  }
}

const styles = StyleSheet.create(
  myImg: {
    width: Dimensions.get('window').width,
    height: >>>???what goes here???<<<
  }
)

1 votes

Jetez un coup d'œil à react-native-scalable-image

70voto

TheJizel Points 953

Essayez ça :

 import React, { Component, PropTypes } from "react";
 import { Image } from "react-native";

export default class ScaledImage extends Component {
constructor(props) {
    super(props);
    this.state = { source: { uri: this.props.uri } };
}

componentWillMount() {
    Image.getSize(this.props.uri, (width, height) => {
        if (this.props.width && !this.props.height) {
            this.setState({
                width: this.props.width,
                height: height * (this.props.width / width)
            });
        } else if (!this.props.width && this.props.height) {
            this.setState({
                width: width * (this.props.height / height),
                height: this.props.height
            });
        } else {
            this.setState({ width: width, height: height });
        }
    });
}

render() {
    return (
        <Image
            source={this.state.source}
            style={{ height: this.state.height, width: this.state.width }}
        />
    );
}
}

ScaledImage.propTypes = {
uri: PropTypes.string.isRequired,
width: PropTypes.number,
height: PropTypes.number
};

Je passe l'URL comme une prop appelée uri . Vous pouvez spécifier votre width prop en tant que Dimensions.get('window').width et ça devrait suffire.

Notez que cela fonctionne également si vous savez à quoi vous voulez fixer la hauteur et que vous devez redimensionner la largeur pour maintenir le rapport. Dans ce cas, vous devez spécifier le paramètre height au lieu de la width un.

1 votes

Cela fonctionne, merci beaucoup. Je suis surpris qu'il n'y ait pas de méthode intégrée pour réaliser cette opération. Je suppose que RN est encore assez récent.

1 votes

@plmok61 Vous pourriez également essayer le programme resizeMode prop dans le Image et en appliquant une flex dans vos styles. J'ai d'abord essayé cette méthode, mais je n'aimais pas la façon dont la hauteur du conteneur ne s'étendait pas en fonction du redimensionnement de l'image.

0 votes

Où ajouter le chemin réel de l'url de l'image ?

32voto

Nedko Dimitrov Points 508

Il y a une propriété resizeMode définissez-le comme "contenant".

Exemple :

<Image
    source={require('./local_path_to/your_image.png')}
    style={{ width: 30 }}
    resizeMode="contain"
 />

Source : https://facebook.github.io/react-native/docs/image#resizemode

8 votes

Cette solution ne fonctionne pas pour "expo" : "^32.0.0", "react" : "16.5.0", "react-native" : " github.com/expo/react-native/archive/sdk-32.0.0.tar.gz ", le réglage de la hauteur uniquement fonctionne, mais le réglage de la largeur uniquement dans le style donne une image vide.

2 votes

Il permet cependant de mettre l'image à l'échelle pour l'adapter à une taille définie, ce qui pourrait aider à résoudre le problème ci-dessus avec un peu de réflexion - cela m'a certainement aidé avec mes images de dimensions inconnues.

8voto

Ihor Burlachenko Points 2037

Jetez un coup d'œil à cette bibliothèque react-native-scalable-image . Il fait exactement ce que vous demandez.

import React from 'react';
import { Dimensions } from 'react-native';
import Image from 'react-native-scalable-image';

const image = (
   <Image
       width={Dimensions.get('window').width} // height will be calculated automatically
       source={{uri: '<image uri>'}}
   />
);

2voto

Haitao Li Points 99

Essayez d'abord ceci et voyez si cela fonctionne pour vous : https://github.com/facebook/react-native/commit/5850165795c54b8d5de7bef9f69f6fe6b1b4763d

Si ce n'est pas le cas, vous pouvez implémenter votre propre composant image. Mais au lieu de prendre la largeur comme prop, vous surchargez onLayout qui vous donne la largeur souhaitée afin que vous puissiez calculer la hauteur. Cela fonctionne mieux si vous ne connaissez pas la largeur et que vous voulez que RN fasse la mise en page pour vous. L'inconvénient est le suivant onLayout est appelé après un passage de la mise en page et du rendu. Vous pouvez donc constater que vos composants se déplacent un peu.

0 votes

Après tout, ... mettre en œuvre votre propre composant est la meilleure solution.

1voto

Thomas Praxl Points 389

Voici l'essentiel d'une solution assez simple qui tire parti des éléments suivants @Haitao Li La proposition de la Commission d'utiliser le rapport d'aspect :

https://gist.github.com/tpraxl/02dc4bfcfa301340d26a0bf2140cd8b9

Pas de magie ni de calculs nécessaires. Du pur "CSS" si vous connaissez les dimensions de l'image originale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X