Quelle est la meilleure façon d'ajouter une image de fond plein écran dans React Native

Je voulais ajouter une image plein écran à la vue alors j'écris ce code

return (
    <View style={styles.container}>
        <Image source={require('image!egg')}  style={styles.backgroundImage}>
    </View>
)

Et défini le style comme

var styles = StyleSheet.create({
container: {
     flex: 1,
     justifyContent: 'center',
     alignItems: 'center',
     backgroundColor: '#F5FCFF',
     flexDirection: 'column',
},
     backgroundImage:{
     width:320,
     height:480,
   }
...

Mais de cette façon, comment suis-je censé trouver la taille réelle de l'écran de l'iPhone?

J'ai vu une API pour accéder à la densité de pixels mais rien sur la taille de l'écran...

Une idée?

118
demandé sur Dorian 2015-03-29 00:44:05

21 réponses

, Vous pouvez utiliser flex: 1 style sur un <Image> élément à remplir tout l'écran. Vous pouvez ensuite utiliser l'un des modes de redimensionnement de L'Image pour que l'image remplisse complètement l'élément:

<Image source={require('image!egg')} style={styles.backgroundImage} />

Style:

import React from 'react-native';

let { StyleSheet } = React;

let styles = StyleSheet.create({
  backgroundImage: {
    flex: 1,
    resizeMode: 'cover', // or 'stretch'
  }
});

Je suis sûr que vous pouvez vous débarrasser de l'emballage <View> de votre image et cela fonctionnera.

84
répondu Josh 2016-09-20 01:11:19

(Cela a été rendu obsolète maintenant, vous pouvez utiliser ImageBackground)

C'est la façon dont je l'ai fait. L'affaire principale était de se débarrasser des tailles fixes statiques.

class ReactStrap extends React.Component {
  render() {
    return (
      <Image source={require('image!background')} style={styles.container}>
        ... Your Content ...
      </Image>
    );
  }
}

var styles = StyleSheet.create({
  container: {
    flex: 1,
    // remove width and height to override fixed static size
    width: null,
    height: null,
  }
};
156
répondu oronbz 2018-05-07 16:53:35

Remarque: Cette solution est vieux. Veuillez vous référer à https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting plutôt que

Essayez cette solution. Il est officiellement pris en charge. Je viens de le tester et fonctionne parfaitement.

var styles = StyleSheet.create({
  backgroundImage: {
    flex: 1,
    alignSelf: 'stretch',
    width: null,
  }
});

Et pour l'utiliser comme image D'arrière-plan, procédez comme suit.

<Image style={styles.backgroundImage}>
  <View>
    <Text>All your stuff</Text>
  </View>
</Image>
39
répondu Vinod Sobale 2017-12-15 09:55:46

J'ai essayé plusieurs de ces réponses en vain pour android en utilisant react-native version = 0.19.0.

Pour une raison quelconque, le resizeMode dans ma feuille de style ne fonctionnait pas correctement? Cependant, lorsque sytlesheet avait

backgroundImage: {
flex: 1,
width: null,
height: null,
}

Et, dans la balise Image, j'ai spécifié le resizeMode:

<Image source={require('path/to/image.png')} style= {styles.backgroundImage} resizeMode={Image.resizeMode.sretch}>

Cela a parfaitement fonctionné! Comme mentionné ci-dessus, vous pouvez utiliser l'Image.resizeMode.couvrir ou contenir ainsi.

Espérons que cela aide!

19
répondu Tab 2016-02-26 00:04:46

Basé sur Braden Rockwell Napier réponse , j'ai fait ce composant BackgroundImage

BackgroundImage.js

import React, { Component } from 'react'
import { Image } from 'react-native'

class BackgroundImage extends Component {
  render() {
    const {source, children, style, ...props} = this.props
    return (
      <Image source={ source }
             style={ { flex: 1, width: null, height: null, ...style } }
             {...props}>
        { children }
      </Image>
    )
  }
}
BackgroundImage.propTypes = {
  source: React.PropTypes.object,
  children: React.PropTypes.object,
  style: React.PropTypes.object
}
export default BackgroundImage

someWhereInMyApp.js

 import BackgroundImage from './backgroundImage'
 ....
 <BackgroundImage source={ { uri: "https://facebook.github.io/react-native/img/header_logo.png" } }>
    <Text>Test</Text>
 </BackgroundImage>
11
répondu Ryan Wu 2017-05-23 11:47:32

Si vous voulez l'utiliser comme image d'arrière - plan, vous devrez utiliser le nouveau composant <ImageBackground> introduit fin juin 2017 dans la version 0.46. Il prend en charge l'imbrication alors que <Image> ne le fera bientôt pas.

Voici le commettre résumé:

Nous supprimons le support des vues d'imbrication à l'intérieur du composant. Nous avons décidé de le faire parce que cette fonctionnalité rend le support intrinsinc content size du <Image> impossible; alors quand le processus de transition est terminée, il n'y aura pas besoin de spécifier l'image taille explicitement, il peut être déduit de l'image réelle bitmap.

Et c'est l'étape #0.

Est un remplacement drop-in très simple qui implémente cette fonctionnalité via un style très simple. S'il vous plaît, utiliser au lieu de si vous voulez mettre quelque chose à l'intérieur.

11
répondu antoine129 2017-07-06 04:16:57

Oh mon Dieu enfin, je trouve un excellent moyen pour React-Native V 0.52-RC et native-base:

Votre balise de contenu devrait être quelque chose comme ceci: //==============================================================

<Content contentContainerStyle={styles.container}>
    <ImageBackground
        source={require('./../assets/img/back.jpg')}
        style={styles.backgroundImage}>
        <Text>
            Some text here ...
        </Text>
    </ImageBackground>
</Content>

Et votre style essentiel est : //==============================================================

container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center'
},
backgroundImage:{
    flex : 1,
    width : '100%'
}

Cela fonctionne très bien amis ... amusez-vous

8
répondu Ali Esfandiari 2018-01-10 13:21:52

Mise à jour Mars 2018 en utilisant L'Image est obsolète utiliser ImageBackground

  <ImageBackground 
          source={{uri: 'https://images.pexels.com/photos/89432/pexels-photo-89432.jpeg?h=350&dpr=2&auto=compress&cs=tinysrgb'}}
          style={{ flex: 1,
            width: null,
            height: null,
            }}
        >
       <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text>Your Contents</Text>
       </View>

 </ImageBackground >
6
répondu Hitesh Sahu 2018-03-06 23:21:02

Dernière date D'Octobre'17 (RN >=.46)

import React from 'react';
import { 
  ...
  ImageBackground,
} from 'react-native';

render() {
  return (
    <ImageBackground source={require('path/to/img')} style={styles.urStyle}>
    </ImageBackground>
  );
}

Http://facebook.github.io/react-native/releases/0.49/docs/images.html#background-image-via-nesting

4
répondu Adesh Shah 2017-10-11 05:30:39

Depuis 0.14 cette méthode ne fonctionnera pas, donc j'ai construit un composant statique qui rendra cela simple pour vous les gars. Vous pouvez simplement coller ceci ou le référencer en tant que composant.

Cela devrait être réutilisable et vous permettra d'ajouter des styles et des propriétés supplémentaires comme s'il s'agissait d'un composant <Image /> Standard

const BackgroundImage = ({ source, children, style, ...props }) => {
  return (
      <Image
        source={source}
        style={{flex: 1, width: null, height: null, ...style}}
        {...props}>
        {children}
      </Image>
  );
}

Il suffit de coller ce et vous pouvez l'utiliser comme image et il doit l'adapter à toute taille de la vue, c'est dans (donc si c'est la vue d'en haut, il remplira votre écran.

<BackgroundImage source={require('../../assets/backgrounds/palms.jpg')}>
    <Scene styles={styles} {...store} />
</BackgroundImage>

Cliquez ici pour un Aperçu de l'Image

3
répondu Braden Rockwell Napier 2015-12-06 20:23:56

Vous devez vous assurer que votre Image a resizeMode = {Image.resizeMode.contient} ou {Image.resizeMode.stretch} et définissez la largeur du style d'image sur null

<Image source={CharacterImage} style={{width: null,}} resizeMode={Image.resizeMode.contain}/>
2
répondu Eric Kim 2015-11-19 19:46:16

La largeur et la hauteur avec la valeur null ne fonctionnent pas pour moi, alors j'ai pensé utiliser la position supérieure, inférieure, gauche et droite et cela a fonctionné. Exemple:

bg: {
        position: 'absolute',
        top: 0,
        bottom: 0,
        left: 0,
        right: 0,
        resizeMode: 'stretch',
},

Et le JSX:

<Image style={styles.bg} source={{uri: 'IMAGE URI'}} />
1
répondu dap1995 2017-01-16 15:28:27

Au cas où vous ne l'auriez pas encore résolu, React Native v. 0. 42. 0 a resizeMode

<Image style={{resizeMode: 'contain'}} source={require('..img.png')} />
1
répondu user7103816 2017-03-10 04:24:59
import React, { Component } from 'react';
import { Image, StyleSheet } from 'react-native';

export default class App extends Component {
  render() {
    return (
      <Image source={{uri: 'http://i.imgur.com/IGlBYaC.jpg'}} style={s.backgroundImage} />
    );
  }
}

const s = StyleSheet.create({
  backgroundImage: {
      flex: 1,
      width: null,
      height: null,
  }
});

, Vous pouvez essayer: https://sketch.expo.io/B1EAShDie (à partir de: github.com/Dorian/sketch-reactive-native-apps)

Docs: https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting

1
répondu Dorian 2017-03-16 06:54:32

Vous pouvez également utiliser votre image comme conteneur:

render() {
    return (
        <Image
            source={require('./images/background.png')}
            style={styles.container}>
            <Text>
              This text will be on top of the image
            </Text>
        </Image>
    );
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
        width: undefined,
        height: undefined,
        justifyContent: 'center',
        alignItems: 'center',
      },
});
1
répondu Agu Dondo 2017-07-12 19:19:09

J'ai entendu parler d'avoir à utiliser BackgroundImage parce qu'à l'avenir vous êtes censé ne pas être en mesure d'imbriquer la balise Image. Mais je ne pouvais pas obtenir BackgroudImage pour afficher correctement mon arrière-plan. Ce que j'ai fait, c'est imbriquer mon Image dans une balise de vue et styliser à la fois la vue extérieure et l'image. Les touches définissaient width sur null et resizemode sur 'stretch'. Voici mon code:

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

export default class BasicImage extends Component {
	constructor(props) {
	  super(props);

	  this.state = {};
	}

	render() {
		return (
			<View style={styles.container}>
	      <Image 
	        source={this.props.source}
	        style={styles.backgroundImage}
	      />
      </View>
		)
	}
}

const styles = StyleSheet.create({   
		container: {
			flex: 1,
			width: null,
			height: null,
			marginBottom: 50
		},
    text: {
    		marginLeft: 5,
    		marginTop: 22,
    		fontFamily: 'fontawesome',
        color: 'black',
        fontSize: 25,
        backgroundColor: 'rgba(0,0,0,0)',
    },
		backgroundImage: {
			flex: 1,
			width: null,
			height: null,
			resizeMode: 'stretch',
		}
});
1
répondu Chris Adams 2017-10-01 19:40:00

Utiliser <ImageBackground> comme déjà dit par antoine129. L'utilisation de <Image> avec des enfants est maintenant obsolète.

class AwesomeClass extends React.Component {
  render() {
    return (
      <ImageBackground source={require('image!background')} style={styles.container}>
        <YourAwesomeComponent/>
      </ImageBackground>
    );
  }
}

var styles = StyleSheet.create({
  container: {
    flex: 1,
  }
};
1
répondu Aung Myat Hein 2017-10-08 07:11:03

(RN >= .46)

Le composant ne peut pas contenir d'enfants si vous souhaitez afficher du contenu au-dessus de l'image, envisagez d'utiliser un positionnement absolu.

, Ou vous pouvez utiliser ImageBackground

import React from 'react';
import { 
  ...
  StyleSheet,
  ImageBackground,
} from 'react-native';

render() {
  return (
    
  <ImageBackground source={require('path/to/img')} style={styles.backgroundImage} >
      <View style={{flex: 1, backgroundColor: 'transparent'}} />
      <View style={{flex: 3,backgroundColor: 'transparent'}} >
  </ImageBackground>
    
  );
}

const styles = StyleSheet.create({
  backgroundImage: {
        flex: 1,
        width: null,
        height: null,
        resizeMode: 'cover'
    },
});
1
répondu Hamid Reza Salimian 2017-12-25 10:20:16

Moyen le plus simple d'implémenter l'arrière-plan:

<ImageBackground style={styles.container} source={require('../../images/screen_login.jpg')}>
  <View style={styles.logoContainer}>
    <Image style={styles.logo}
      source={require('../../images/logo.png')}
    />
  </View> 
  <View style={styles.containerTextInput}>
    < LoginForm />
  </View>   
</ImageBackground>

const styles = StyleSheet.create({
  container: {
    flex: 1,
    //   backgroundColor:"#0984e3"
  },
  containerTextInput: {
    marginTop: 10,
    justifyContent: 'center'
  },

  logoContainer: {
    marginTop: 100,
    justifyContent: 'center',
    alignItems: 'center'
  },
  logo: {
    height: 150,
    width: 150
  }
});
1
répondu Ahmad Sadiq 2018-07-31 06:39:19

Mise à jour vers ImageBackground

Puisque l'utilisation de <Image /> en tant que conteneur est obsolète pendant un certain temps, Toutes les réponses manquent en fait quelque chose d'important. Pour une utilisation correcte choisir <ImageBackground /> avec style et imageStyle prop. Appliquer tous les styles D'Image pertinents à imageStyle.

Par exemple:

<ImageBackground
    source={yourImage}
    style={{
      backgroundColor: '#fc0',
      width: '100%', // applied to Image
      height: '100%' 
    }}
    imageStyle={{
      resizeMode: 'contain' // works only here!
    }}
>
    <Text>Some Content</Text>
</ImageBackground>

Https://github.com/facebook/react-native/blob/master/Libraries/Image/ImageBackground.js

1
répondu Pawel 2018-08-11 07:46:07

Une autre solution facile:

<Image source={require('../assets/background.png')}
      style={{position: 'absolute', zIndex: -1}}/>

<View style={{flex: 1, position: 'absolute'}}>

  {/*rest of your content*/}
</View>
0
répondu Serdar Değirmenci 2017-09-23 02:11:35