Какой лучший способ добавить полноэкранное фоновое изображение в React Native
Я хотел добавить полноэкранное изображение в представление, поэтому я пишу этот код
return (
<View style={styles.container}>
<Image source={require('image!egg')} style={styles.backgroundImage}>
</View>
)
и определил стиль как
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
flexDirection: 'column',
},
backgroundImage:{
width:320,
height:480,
}
...
но таким образом, как я должен найти фактический размер экрана iPhone?
Я видел API для доступа к плотности пикселей, но ничего о размере экрана...
Любая идея?
Ответы
Ответ 1
Вы можете использовать стиль flex: 1
для элемента <Image>
, чтобы он заполнил весь экран. Затем вы можете использовать один из режимов изменения размера изображения, чтобы изображение полностью заполнило элемент:
<Image source={require('image!egg')} style={styles.backgroundImage} />
Стиль:
import React from 'react-native';
let { StyleSheet } = React;
let styles = StyleSheet.create({
backgroundImage: {
flex: 1,
resizeMode: 'cover', // or 'stretch'
}
});
Я уверен, что вы можете избавиться от <View>
упаковки вашего изображения, и это сработает.
Ответ 2
(Это устарело, теперь вы можете использовать ImageBackground)
Вот как я это сделал. Основной сделкой было избавление от статических фиксированных размеров.
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,
}
};
Ответ 3
Примечание: это решение старое. Пожалуйста, обратитесь к https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting вместо
Попробуйте это решение. Это официально поддерживается. Я только что проверил и работает без нареканий.
var styles = StyleSheet.create({
backgroundImage: {
flex: 1,
alignSelf: 'stretch',
width: null,
}
});
А что касается использования его в качестве фонового изображения, просто сделайте следующее.
<Image style={styles.backgroundImage}>
<View>
<Text>All your stuff</Text>
</View>
</Image>
Ответ 4
Я попробовал несколько из этих ответов безрезультатно для android, используя реактивную версию = 0.19.0.
По какой-то причине resizeMode внутри моей таблицы стилей не работает должным образом? Однако, когда sytlesheet имел
backgroundImage: {
flex: 1,
width: null,
height: null,
}
и в теге Image я указал параметр resizeMode:
<Image source={require('path/to/image.png')} style= {styles.backgroundImage} resizeMode={Image.resizeMode.sretch}>
Это сработало отлично! Как упоминалось выше, вы можете использовать Image.resizeMode.cover или также содержать.
Надеюсь, это поможет!
Ответ 5
На основе Braden Rockwell Napier answer, я сделал этот компонент 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>
Ответ 6
Если вы хотите использовать его в качестве фонового изображения, вам нужно будет использовать новый компонент <ImageBackground>
представленный в конце июня 2017 года в v0.46. Он поддерживает вложенность, а <Image>
скоро не будет.
Вот описание commit:
Мы удаляем поддержку вложенных представлений внутри компонента. Мы решили сделать это, потому что эта функция поддерживает intrinsinc content size
of <Image>
невозможно; поэтому, когда процесс перехода завершен, нет необходимости указывать образ размер явно, он может быть выведен из фактического растрового изображения изображения.
И это шаг # 0.
- очень простая замена, которая реализует эта функциональность благодаря очень простому стилю. Пожалуйста, используйте а не если вы хотите что-то поставить внутри.
Ответ 7
Обновление за март 2018 Использование Image устарело использовать 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 >
Ответ 8
О Боже, наконец, я нашел отличный способ для React-Native V 0.52-RC и native-base:
Ваш тег содержимого должен выглядеть примерно так://======================================= =======================
<Content contentContainerStyle={styles.container}>
<ImageBackground
source={require('./../assets/img/back.jpg')}
style={styles.backgroundImage}>
<Text>
Some text here ...
</Text>
</ImageBackground>
</Content>
И Ваш основной стиль://=============================================== ====================
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
backgroundImage:{
flex : 1,
width : '100%'
}
Работает хорошо, друзья... веселиться
Ответ 9
ОБНОВЛЕНИЕ до ImageBackground
Поскольку использование <Image/>
в качестве контейнера на некоторое время устарело, во всех ответах пропущено что-то важное. Для правильного использования выберите <ImageBackground/>
со style
и imageStyle
. Примените все стили, соответствующие изображению, к imageStyle
.
Например:
<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
Ответ 10
Последние с октября 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
Ответ 11
С 0,14 этот метод не будет работать, поэтому я создал статический компонент, который сделает это простым для вас, ребята. Вы можете просто вставить это или ссылаться на него как на компонент.
Это должно быть повторно использовано, и это позволит вам добавлять дополнительные стили и свойства как-бы если бы это был стандартный <Image />
компонент
const BackgroundImage = ({ source, children, style, ...props }) => {
return (
<Image
source={source}
style={{flex: 1, width: null, height: null, ...style}}
{...props}>
{children}
</Image>
);
}
просто вставьте это, а затем вы можете использовать его как изображение, и он должен соответствовать всему размеру вида, в котором он находится (так что если это вид сверху, он заполнит ваш экран.
<BackgroundImage source={require('../../assets/backgrounds/palms.jpg')}>
<Scene styles={styles} {...store} />
</BackgroundImage>
Нажмите здесь для предварительного просмотра
Ответ 12
Вам необходимо убедиться, что у вашего изображения resizeMode = {Image.resizeMode.contain} или {Image.resizeMode.stretch} и установите ширину стиля изображения равным null
<Image source={CharacterImage} style={{width: null,}} resizeMode={Image.resizeMode.contain}/>
Ответ 13
Ширина и высота со значением null не работают для меня, тогда я думал использовать верхнюю, нижнюю, левую и правую позиции, и это сработало.
Пример:
bg: {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
resizeMode: 'stretch',
},
И JSX:
<Image style={styles.bg} source={{uri: 'IMAGE URI'}} />
Ответ 14
(RN> =.46)
Компонент не может содержать дочерние элементы, если вы хотите визуализировать содержимое поверх изображения, рассмотрите возможность использования абсолютного позиционирования.
или вы можете использовать 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'
},
});
Ответ 15
Самый простой способ реализовать фон:
<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
}
});
Ответ 16
Если вы еще не решили, React Native v.0.42.0 имеет resizeMode
<Image style={{resizeMode: 'contain'}} source={require('..img.png')} />
Ответ 17
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,
}
});
Вы можете попробовать: https://sketch.expo.io/B1EAShDie (from: github.com/Dorian/sketch-reactive-native-apps)
Документы: https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting
Ответ 18
Вы также можете использовать свое изображение в качестве контейнера:
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',
},
});
Ответ 19
Я слышал о том, что должен использовать BackgroundImage, потому что в будущем вы не должны вставлять тег Image. Но я не мог заставить BackgroudImage правильно отображать мой фон. То, что я сделал, было гнездом моего изображения внутри тега View и стиля как внешнего вида, так и изображения. Ключи устанавливали ширину до нуля и устанавливали resizeMode для "растяжения". Ниже мой код:
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',
}
});
Ответ 20
Используйте <ImageBackground>
, как уже сказано, antoine129. Использование <Image>
с детьми теперь устарело.
class AwesomeClass extends React.Component {
render() {
return (
<ImageBackground source={require('image!background')} style={styles.container}>
<YourAwesomeComponent/>
</ImageBackground>
);
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
}
};
Ответ 21
import { ImageBackground } from "react-native";
<ImageBackground
style={{width: '100%', height: '100%'}}
source={require('../assets/backgroundLogin.jpg ')}> //path here inside
<Text>React</Text>
</ImageBackground>
Ответ 22
Еще одно простое решение:
<Image source={require('../assets/background.png')}
style={{position: 'absolute', zIndex: -1}}/>
<View style={{flex: 1, position: 'absolute'}}>
{/*rest of your content*/}
</View>
Ответ 23
Я решил проблему с фоновым изображением, используя этот код.
import React from 'react';
import { StyleSheet, Text, View,Alert,ImageBackground } from 'react-native';
import { TextInput,Button,IconButton,Colors,Avatar } from 'react-native-paper';
class SignInScreen extends React.Component {
state = {
UsernameOrEmail : '',
Password : '',
}
render() {
return (
<ImageBackground source={require('../assets/icons/background3.jpg')} style {styles.backgroundImage}>
<Text>React Native App</Text>
</ImageBackground>
);
}
}
export default SignInScreen;
const styles = StyleSheet.create({
backgroundImage: {
flex: 1,
resizeMode: 'cover', // or 'stretch'
}
});
Ответ 24
ImageBackground может иметь ограничение
На самом деле, вы можете использовать напрямую, и это не устарело.
Если вы хотите добавить фоновое изображение в React Native, а также хотите добавить другие элементы в это фоновое изображение, выполните следующие действия:
-
Создать представление контейнера
- Создайте элемент Image со 100% шириной и высотой. Также resizeMode: "Cover"
- Создайте другой элемент View под элементом Image с позицией: 'absolute'
Это код, который я использую:
import React, { Component } from 'react';
import {Text, View, Image} from 'react-native';
import Screen from '../library/ScreenSize'
export default class MenuScreen extends Component {
static navigationOptions = {
header: null
}
render() {
return (
<View style={{ flex: 1 }}>
<Image
style={{
resizeMode: "cover",
width: "100%",
height: "100%",
justifyContent: "center",
alignItems: "center",
opacity: 0.4
}}
source={require("../assets/images/menuBackgroundImage.jpg")}
></Image>
<View style={{
width: Screen.width,
height: Screen.height * 0.55,
position: 'absolute',
bottom: 0}}>
<Text style={{
fontSize: 48
}}>Glad to Meet You!</Text>
</View>
</View>
);
}
}
Наслаждайтесь кодированием....
Выход:
![This is the output of my code.]()