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?
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.
(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,
}
};
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>
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!
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>
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.
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
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 >
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
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>
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}/>
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'}} />
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')} />
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
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',
},
});
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',
}
});
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,
}
};
(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'
},
});
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
}
});
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
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>