web-dev-qa-db-fra.com

Hauteur d'image React-Native (pleine largeur)

J'ai une image que je tire d'une URL. Je ne connais pas à l'avance les dimensions de cette image.

Comment styliser/mettre en page le <Image/> il s'agit donc de toute la largeur de la vue parent et la hauteur est calculée de sorte que le rapport hauteur/largeur soit conservé?

J'ai essayé d'utiliser onLoad dans 0.34.0-rc.0 et la hauteur/largeur sont toutes les deux 0 dans event.nativeEvent.source.

L'image est dans un <ScrollView/>. Je ne recherche pas une image plein écran.

16
Alex Curtis

React Native a une fonction intégrée qui retournera la largeur et la hauteur d'une image: Image.getSize(). Consultez la documentation ici

7
Jason Gaare

Mon utilisation était très similaire en ce que je devais afficher une image avec largeur plein écran mais en conservant son rapport hauteur/largeur.

Sur la base de la réponse de @ JasonGaare à utiliser Image.getSize(), j'ai trouvé l'implémentation suivante:

class PostItem extends React.Component {

  state = {
    imgWidth: 0,
    imgHeight: 0,
  }

  componentDidMount() {

    Image.getSize(this.props.imageUrl, (width, height) => {
      // calculate image width and height 
      const screenWidth = Dimensions.get('window').width
      const scaleFactor = width / screenWidth
      const imageHeight = height / scaleFactor
      this.setState({imgWidth: screenWidth, imgHeight: imageHeight})
    })
  }

  render() {

    const {imgWidth, imgHeight} = this.state

    return (
      <View>
        <Image
          style={{width: imgWidth, height: imgHeight}}
          source={{uri: this.props.imageUrl}}
        />
        <Text style={styles.title}>
          {this.props.description}
        </Text>
      </View>
    )
  }
}
17
nburk

Je suis nouveau sur react-native mais je suis tombé sur cette solution en utilisant un style simple:

imageStyle: {
  height: 300,
  flex: 1,
  width: null}

Image pleine largeur de mon 1º App

Cela a fonctionné pour moi - Quelles sont vos pensées?

Merci d'avance.

11
rfdc

Ça a marché pour moi.

import React from 'react'
import { View, Text, Image } from 'react-native'

class Test extends React.Component {
  render() {
    return (
      <View>
        <Image
          source={{ uri: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQL6goeE1IdiDqIUXUzhzeijVV90TDQpigOkiJGhzaJRbdecSEf" }}
          style={{ height: 200, left: 0, right: 0 }}
          resizeMode="contain"
        />
        <Text style={{ textAlign: "center" }}>Papaya</Text>
      </View>
    );
  }
}

export default Test;

Vous pouvez également obtenir la largeur de la vue parent après l'événement de mise en page.

<View 
  style={{ flex: 1}} 
  layout={(event) => { this.setState({ width: event.nativeEvent.layout.width }); }}
/>

Lorsque vous obtenez une vue parent de largeur à partir d'un événement de disposition, vous pouvez attribuer une largeur à la balise Image.

import React from 'react';
import { View, Image } from 'react-native';

class Card extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      height: 300,
      width: 0
    };
  }
  render() {
    return (
      <View style={{
        flex: 1,
        flexDirection: 'row'
      }}>
        <View style={{ width: 50, backgroundColor: '#f00' }} />
        <View
          style={{ flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#fafafa' }}
          onLayout={(event) => { this.setState({ width: event.nativeEvent.layout.width }); }}
        >
          {
            this.state.width === 0 ? null : (
              <Image
                source={{ uri: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQL6goeE1IdiDqIUXUzhzeijVV90TDQpigOkiJGhzaJRbdecSEf" }}
                style={{ width: this.state.width, height: this.state.height }}
                resizeMode="contain"
              />
            )
          }
        </View>
      </View>
    );
  }
}
export default Card;
4
Kakashi