Как лучше всего добавить полноэкранное фоновое изображение в React Native?

150

Я хотел добавить полноэкранное изображение в представление, поэтому я пишу этот код

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 для доступа к плотности пикселей, но ничего о размере экрана ...

Любая идея?

Talpaz
источник
Как насчет производительности? Это нормально для использования .pngили .jpg? Можно ли хранить изображение обоев внутри дерева каталогов приложения? Или лучше использовать что-то еще? .svgили что-нибудь?
Зеленый

Ответы:

113

Вы можете использовать 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>упаковки вашего изображения, и это сработает.

мистифицировать
источник
1
Да, это работает, я переместил элемент Image как самый верхний и установил его стиль как backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, },Спасибо
talpaz
4
Поработав с этим некоторое время, я обнаружил, что проще всего обернуть Imageкомпонент в абсолютно расположенное положение, Viewчтобы фоновое изображение появлялось позади другого содержимого на экране.
Джош Хабдас
3
Важное изменение: <Image src=...>сейчас<Image source=...>
Имя пользователя
Теперь, когда поддерживается z-index, измените ли вы этот ответ?
Макенова
Это хорошо, но изображение растягивается, и на экране включена прокрутка
Ananta Prasad
178

(Это устарело, теперь вы можете использовать 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,
  }
};
oronbz
источник
1
Да, именно так это должно быть сделано docs facebook.github.io/react-native/docs/…
Даниэль Штайгервальд
16
Это лучший ответ!
Вансон Вин Ленг
3
Спасибо! Убедитесь, что Imageваш первый возвращенный компонент - контейнер. Сначала я случайно вложил Imageв Viewконтейнер контейнер.
Glavin001
6
YellowBox.js: 76 Использование <Image> с детьми не рекомендуется и будет ошибкой в ​​ближайшем будущем. Пожалуйста, пересмотрите макет или используйте вместо него <ImageBackground>. Когда я добавляю содержимое в <Image>, появляется это предупреждение. это действительно раздражает.
Бенджамин Вен
4
это на самом деле не рекомендуется. Использовать ImageBackground или (лучшую) позицию: абсолютное
Майк
43

Примечание: это решение старое. Пожалуйста, обратитесь к 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>
Винод Собале
источник
Что, это официально поддерживается?
rclai
1
Да. Это. facebook.github.io/react-native/docs/...
Винод Sobale
Какая польза alignSelfи widthздесь?
Харкират Салуджа
Вы растягиваете <Image /> до доступной ширины, и ширина должна иметь значение NULL, чтобы «растянуть» работал
Vinod Sobale
К вашему сведению, компоненты Image не могут иметь детей в последней версии React (0.51.0). Это больше не работает.
rplankenhorn
20

Я попробовал несколько из этих ответов безрезультатно для 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 или содержать также.

Надеюсь это поможет!

табуляция
источник
16

Обновление за март 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 >
Хите саху
источник
Документация: facebook.github.io/react-native/docs/…
радость
1
Это правильно, теперь вы должны использовать ImageBackground, Image как контейнер устарел. Просмотр в качестве контейнера здесь не требуется, вы можете использовать только ImageBackground в качестве основного контейнера.
Диего
13

На основе Брейден Rockwell Napier «S ответа , я сделал этот 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>
Райан Ву
источник
12

ОБНОВЛЕНИЕ 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

Павел Сас
источник
11

Если вы хотите использовать его в качестве фонового изображения, вам нужно будет использовать новый <ImageBackground>компонент, представленный в конце июня 2017 года в версии 0.46. Это поддерживает вложение, в то время как <Image>скоро не будет.

Вот сводка коммитов :

Мы удаляем поддержку вложенных представлений внутри компонента. Мы решили сделать это , потому что наличие этой функции делает поддержку intrinsinc content sizeиз<Image> невозможной; поэтому, когда процесс перехода будет завершен, не нужно будет явно указывать размер изображения, это может быть выведено из фактического растрового изображения.

И это шаг № 0.

это очень простая замена, которая реализует эту функцию с помощью очень простого стиля. Пожалуйста, используйте вместо, если вы хотите положить что-то внутрь.

antoine129
источник
9

О Боже, наконец, я нашел отличный способ для 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%'
}

Работает хорошо, друзья ... веселиться

Али Эсфандиари
источник
Привет, Просто хочу убедиться, что ImageBackground откуда импортируется?
Рудольф Опперман,
Хорошо, так ImageBackground, который я импортировал из реактивной системы, однако я не могу установить: 100%
Рудольф Опперман,
Вы когда-нибудь сталкивались с проблемой, когда он отображается на эмуляторе Android, но не на устройстве?
Рудольф Опперман
Извините за мой поздний ответ, вы можете импортировать ImageBackground из React Native: import {ImageBackground} из'act-native '; устройство ведьмы ты тестировал? Я не нашел никаких проблем на устройстве.
Али Эсфандиари
Мой Эмулятор был Nexus 5 specs. А моим андроидом был Wileyfox Swift. Основным отличием было разрешение, поэтому я проверил его на изображении и похоже, что если разрешение изображения выше, чем на вашем устройстве, оно не отображается. Я попытался уменьшить изображение с помощью стилей, но ничего не получилось, поэтому я изменил разрешение на изображении ниже, и теперь оно работает нормально. Низкое разрешение на самом деле не было проблемой, потому что это экран входа в систему, и на нем есть несколько текстовых входов и кнопок. Большое спасибо.
Рудольф Опперман
4

Начиная с версии 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>

Нажмите здесь для предварительного просмотра изображения

Брэден Роквелл Нейпир
источник
4
import { ImageBackground } from "react-native";
<ImageBackground
     style={{width: '100%', height: '100%'}}
     source={require('../assets/backgroundLogin.jpg ')}> //path here inside
    <Text>React</Text>
</ImageBackground>
Навед хан
источник
3

Чтобы справиться с этим вариантом использования, вы можете использовать <ImageBackground>компонент, который имеет те же реквизиты, что и<Image> , и добавить в него все дочерние вы хотели бы выложить поверх него.

Пример:

return (
  <ImageBackground source={...} style={{width: '100%', height: '100%'}}>
    <Text>Inside</Text>
  </ImageBackground>
);

Для большего: ImageBackground | React Native

Обратите внимание, что вы должны указать некоторые атрибуты стиля ширины и высоты.

TPM ABDULKAREEM
источник
2

Вы должны убедиться, что ваше изображение имеет resizeMode = {Image.resizeMode.contain} или {Image.resizeMode.stretch} и установить ширину стиля изображения на ноль

<Image source={CharacterImage} style={{width: null,}} resizeMode={Image.resizeMode.contain}/>
Эрик Ким
источник
2

Ширина и высота со значением null у меня не работают, тогда я решил использовать верхнюю, нижнюю, левую и правую позиции, и это сработало. Пример:

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

И JSX:

<Image style={styles.bg} source={{uri: 'IMAGE URI'}} />
dap1995
источник
2

(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'
    },
});

Хамид Реза Салимиан
источник
2

Самый простой способ реализовать фон:

<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
  }
});
Ахмад Садик
источник
2

Для меня это работает нормально, я использовал ImageBackground, чтобы установить фоновое изображение:

import React from 'react';
import { SafeAreaView, StyleSheet, ScrollView, View, Text, StatusBar, Image, ImageBackground } from 'react-native';
const App: () => React$Node = () => {
return (
    <>
      <StatusBar barStyle="dark-content" />
      <View style={styles.container}> 
      <ImageBackground source={require('./Assets.xcassets/AppBackGround.imageset/2x.png')} style={styles.backgroundImage}>
        <View style={styles.sectionContainer}>
              <Text style={styles.title}>Marketing at the speed of today</Text>
        </View>
      </ImageBackground>
      </View>
    </>
  );
};


const styles = StyleSheet.create({
  container: {
    flex: 1,
    fontFamily: "-apple-system, BlinkMacSystemFont Segoe UI",
    justifyContent: "center",
    alignItems: "center",
  },
  backgroundImage: {
    flex: 1,
    resizeMode: 'cover',
    height: '100%',
    width: '100%'
  },
  title:{
    color: "#9A9A9A",
    fontSize: 24,
    justifyContent: "center",
    alignItems: "center",
  },
sectionContainer: {
    marginTop: 32,
    paddingHorizontal: 24,
  },
});

export default App;
Абдул Карим Хан
источник
1

если вы еще не решили, React Native v.0.42.0 имеют resizeMode

<Image style={{resizeMode: 'contain'}} source={require('..img.png')} />
user7103816
источник
1
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 (от: github.com/Dorian/sketch-reactive-native-apps )

Документы: https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting

Дориан
источник
1

Вы также можете использовать свое изображение в качестве контейнера:

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

Я слышал о необходимости использовать 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',
		}
});

Крис Адамс
источник
1

Используйте, <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,
  }
};
Аунг Мят Хейн
источник
0

Еще одно простое решение:

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

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

  {/*rest of your content*/}
</View>
Сердар Дежирменци
источник
0

Я решил проблему с фоновым изображением, используя этот код.

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'
     }
   });
Адель Ахмед Балоч
источник
0

Если вы хотите добавить фоновое изображение, вы можете сделать это, используя, но сначала вы должны импортировать это из'act-native 'следующим образом:

import {ImageBackground} from 'react-native';

затем:

    export default function App() {
    
    return (
        <View style={styles.body}>

            <ImageBackground source={require('./path/to/yourimage')} style={styles.backgroungImage}>
                <View style={styles.container}>Hello world!
                </View>
            </ImageBackground>
        </View>
    );
}

    const styles = StyleSheet.create({
    backgroungImage: {
    flex: 1,
    maxWidth: '100%',
  }
});
SummitK
источник
-1

ImageBackground может иметь ограничение

На самом деле, вы можете использовать напрямую, и это не рекомендуется.

Если вы хотите добавить фоновое изображение в React Native, а также хотите добавить другие элементы в это фоновое изображение, выполните следующие действия:

  1. Создать представление контейнера
  2. Создайте элемент Image со 100% шириной и высотой. Также resizeMode: «Обложка»
  3. Создайте другой элемент 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>
        );
    }
}

Наслаждайтесь кодированием ....

Вывод:

Это вывод моего кода.

Чхай Рит Хи
источник