Що найкраще додати повне екранне фонове зображення в React Native


149

Я хотів додати зображення до повного екрану до перегляду, щоб написати цей код

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 для доступу до щільності пікселів, але нічого про розмір екрана ...

Будь-яка ідея?


Як щодо продуктивності? Це нормально використовувати .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
Так, це працює, я перемістив елемент зображення як найкращий і встановив його стиль як backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, },спасибі
talpaz

4
Протягом деякого часу, боручись із цим, мені здалося, що найпростіше загортати Imageкомпонент в абсолютно розміщеному Viewдля того, щоб фонове зображення відображалося за іншим вмістом на екрані.
Джош Хабдас

3
Важлива редакція: <Image src=...>зараз<Image source=...>
Ім'я користувача

Тепер, коли z-індекс підтримується, ви б змінили цю відповідь?
makenova

Це добре, але зображення розтягується і прокрутка включена на екрані
Ананта Прасад

177

(Це застаріле тепер ви можете використовувати 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,
  }
};

1
Так, саме так повинні робити документи facebook.github.io/react-native/docs/…
Daniel Steigerwald

15
Це найкраща відповідь!
Vanson Wing Leung

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


В чому користь alignSelfі widthтут?
Харкірат Салуя

Ви розтягуєте <Зображення /> до доступної ширини, а ширина повинна мати нульовий характер, щоб "розтяжка" працювала
Vinod Sobale

FYI, Компоненти зображення не можуть мати дітей в останній версії React (0.51.0). Це більше не працює.
rplankenhorn

20

Я спробував кілька таких відповідей безрезультатно для Android, використовуючи рідну версію реакцій = 0.19.0.

Чомусь ResizeMode всередині мого таблиця стилів не працював належним чином? Однак, коли ситлест був

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 року Використання зображення застаріло, використовуйте 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 >


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>

11

Якщо ви хочете використовувати його як фонове зображення, вам потрібно буде використовувати новий <ImageBackground>компонент, представлений наприкінці червня 2017 року в v0.46. Він підтримує гніздування, поки <Image>незабаром не буде.

Ось зробити резюме:

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

І це крок №0.

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


11

ОНОВЛЕННЯ до 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


9

О, Боже, нарешті, я знаходжу чудовий спосіб для React-Native V 0.52-RC та рідної бази:

Ваш тег вмісту повинен бути приблизно таким: // ========================================== ========================

<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 Emulator, але не на пристрої?
Рудольф Опперман

Вибачте за мою пізню відповідь, ви можете імпортувати ImageBackground з React Native: імпортувати {ImageBackground} з "реагувати-рідного"; відьмовий прилад ви тестували? Я не знайшов жодної проблеми на пристрої.
Алі Есфандіарі

Мій емулятор був специфікацією Nexus 5. А мій андроїд був 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>

Натисніть тут, щоб переглянути попереднє зображення



3

Для обробки цього випадку ви можете використовувати <ImageBackground>компонент, який має ті ж реквізити <Image>, що і реквізити , і додати до нього те, що ви хотіли б шарувати поверх нього.

Приклад:

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

Докладніше: ImageBackground | Реагуйте рідні

Зауважте, що ви повинні вказати деякі атрибути стилю ширини та висоти.


3
import { ImageBackground } from "react-native";
<ImageBackground
     style={{width: '100%', height: '100%'}}
     source={require('../assets/backgroundLogin.jpg ')}> //path here inside
    <Text>React</Text>
</ImageBackground>

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'}} />

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')} />

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

-1

ImageBackground може мати обмеження

Власне, ви можете використовувати безпосередньо, і це не застаріло.

Якщо ви хочете додати фонове зображення у React Native, а також бажаєте додати інші елементи до цього фонового зображення, виконайте крок нижче:

  1. Створіть подання контейнера
  2. Створіть елемент зображення зі 100% шириною та висотою. Також resizeMode: 'Обкладинка'
  3. Створіть ще один елемент перегляду під Елементом зображення з позицією: 'абсолютний'

Це код, який я використовую:

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>
        );
    }
}

Насолоджуйтесь кодування ....

Вихід:

Це вихід мого коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.