Qual é a melhor maneira de adicionar uma imagem de plano de fundo em tela cheia no React Native


148

Eu queria adicionar uma imagem em tela cheia ao modo de exibição, para escrever esse código

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

e definiu o estilo como

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

mas dessa maneira, como devo encontrar o tamanho real da tela do iPhone?

Eu vi uma API para acessar a densidade de pixels, mas nada sobre o tamanho da tela ...

Qualquer ideia?


E quanto ao desempenho? Está tudo bem em usar .pngou .jpg? Você pode armazenar a imagem do papel de parede na árvore de diretórios do aplicativo? Ou é melhor usar outra coisa? .svgou nada?
Verde

Respostas:


112

Você pode usar o flex: 1estilo em um <Image>elemento para que ele preencha a tela inteira. Você pode usar um dos modos de redimensionamento da imagem para que a imagem preencha completamente o elemento:

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

Estilo:

import React from 'react-native';

let { StyleSheet } = React;

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

Tenho certeza que você pode se livrar da <View>quebra de sua imagem e isso funcionará.


1
Sim, ele funciona, eu mudei o elemento imagem como mais alto e definir seu estilo como backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, },Graças
Talpaz

4
Depois de lutar por um tempo, achei mais fácil agrupar o Imagecomponente em uma posição absolutamente absoluta Viewpara permitir que a imagem de segundo plano aparecesse atrás de outro conteúdo na tela.
Josh Habdas

3
Edição importante: <Image src=...>agora é<Image source=...>
Nome de usuário

Agora que o z-index é suportado, você mudaria esta resposta?
Makenova

Ele é bom, mas a imagem é alongamento e de rolagem está ativado na tela
Ananta Prasad

177

(Isso foi descontinuado agora você pode usar o ImageBackground )

Foi assim que eu fiz. O negócio principal era se livrar dos tamanhos fixos estáticos.

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
Sim, é assim que deve ser feito por docs facebook.github.io/react-native/docs/…
Daniel Steigerwald

15
Esta é a melhor resposta!
Vanson Wing Leung

3
Obrigado! Verifique se esse Imageé o seu primeiro componente retornado, o contêiner. No começo, aninhei acidentalmente o que estava Imagedentro Viewdo contêiner.
Glavin001

6
YellowBox.js: 76 O uso de <Image> com filhos está obsoleto e será um erro no futuro próximo. Reconsidere o layout ou use <ImageBackground>. Quando adiciono conteúdo à <Imagem>, esse aviso aparece. é realmente irritante.
Benjamin Wen

4
isso está realmente obsoleto. Use ImageBackground ou (melhor) posição: absoluta
Mike

43

Nota: Esta solução é antiga. Por favor, consulte https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting vez

Experimente esta solução. É oficialmente suportado. Acabei de testá-lo e funciona perfeitamente.

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

E quanto a usá-lo como imagem de fundo, faça o seguinte.

<Image style={styles.backgroundImage}>
  <View>
    <Text>All your stuff</Text>
  </View>
</Image>

O que é isso oficialmente suportado?
rclai


Qual é o uso de alignSelfe widthaqui?
Harkirat Saluja

Você está esticando <Imagem /> à largura necessidades disponíveis e largura para ter nulo, a fim de 'esticar' para o trabalho
Vinod Sobale

Para sua informação, os componentes de imagem não podem ter filhos na versão mais recente do React (0.51.0). Isso não funciona mais.
rplankenhorn

20

Eu tentei várias dessas respostas sem sucesso para o Android usando a versão react-native = 0.19.0.

Por alguma razão, o resizeMode dentro da minha folha de estilo não funcionou adequadamente? No entanto, quando o sytleheet tinha

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

e, na tag Image, especifiquei o resizeMode:

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

Funcionou perfeitamente! Como mencionado acima, você pode usar Image.resizeMode.cover ou conter também.

Espero que isto ajude!


16

Atualizar março de 2018 Usar imagem está obsoleto, use 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
Isso está correto, agora você precisa usar o ImageBackground, a imagem como um contêiner está obsoleta. Exibir como um contêiner aqui não é necessário, você pode usar apenas o ImageBackground como o contêiner principal.
Diego Unanue

13

Baseado em Braden Rockwell Napier 's resposta , eu fiz este BackgroundImagecomponente

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

Se você quiser usá-lo como imagem de plano de fundo, precisará usar o novo <ImageBackground>componente introduzido no final de junho de 2017 na v0.46. Ele suporta o aninhamento enquanto em <Image>breve não.

Aqui está o resumo do commit :

Estamos removendo o suporte de visualizações de aninhamento dentro do componente. Decidimos fazer isso porque ter esta característica faz com apoio intrinsinc content sizedo<Image> impossibilita ; portanto, quando o processo de transição estiver concluído, não haverá necessidade de especificar explicitamente o tamanho da imagem; isso poderá ser deduzido do bitmap da imagem real.

E este é o passo # 0.

é um substituto muito simples que implementa essa funcionalidade por meio de um estilo muito simples. Por favor, use em vez de se você quiser colocar algo dentro.


11

ATUALIZAÇÃO para ImageBackground

Como o uso <Image />como contêiner está obsoleto por um tempo, todas as respostas perdem algo importante. Para uso adequado, escolha <ImageBackground />com style e imageStyle suporte. Aplique todos os estilos relevantes à imagem em imageStyle.

Por exemplo:

<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

Oh Deus Por fim, acho uma ótima maneira para o React-Native V 0.52-RC e o native-base:

Sua tag de conteúdo deve ser algo como: // ======================================= =======================

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

E o seu estilo essencial é: // ========================================== ====================

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

Funciona bem, amigos ... divirta-se


Olá, Só quero ter certeza de que o ImageBackground é importado?
Rudolph Opperman

OK tão ImageBackground I importados de reagir nativo no entanto, não é possível definir com: 100%
Rudolph Opperman

Você já encontrou um problema em que ele é exibido no emulador do Android, mas não no dispositivo?
Rudolph Opperman

Desculpe pela minha resposta tardia, você pode importar o ImageBackground do React Native: import {ImageBackground} do 'react-native'; qual dispositivo você testou? Não encontrei nenhum problema no dispositivo.
Ali Esfandiari

Meu emulador era um Nexus 5 especificações. E o meu androide era o Wileyfox Swift. A principal diferença foi a resolução, então eu verifiquei na imagem e parece que se a resolução da imagem for maior que o seu dispositivo, ela não será exibida. Tentei diminuir a imagem com estilos, mas não funcionou, por isso alterei a resolução da imagem para baixo e agora parece funcionar bem. A resolução mais baixa não foi realmente um problema, pois é uma tela de login e existem algumas entradas e botões de texto. Muito obrigado.
Rudolph Opperman

4

Desde 0.14, esse método não funciona, então eu criei um componente estático que simplificará isso para vocês. Você pode simplesmente colar isso ou fazer referência a ele como um componente.

Isso deve ser reutilizável e permitirá adicionar estilos e propriedades adicionais como se fosse um <Image />componente padrão

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

basta colar isso e então você pode usá-lo como imagem e deve caber em todo o tamanho da visualização em que está (por isso, se for a visualização superior, ela preencherá a tela.

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

Clique aqui para uma imagem de visualização



3

Para lidar com esse caso de uso, você pode usar o <ImageBackground>componente, que tem os mesmos adereços que <Image>, e adicionar quaisquer filhos a ele que gostaria de colocar em cima dele.

Exemplo:

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

Para mais: ImageBackground | Reagir nativo

Observe que você deve especificar alguns atributos de estilo de largura e altura.


2

Você precisa garantir que sua imagem tenha resizeMode = {Image.resizeMode.contain} ou {Image.resizeMode.stretch} e defina a largura do estilo da imagem como nula

<Image source={CharacterImage} style={{width: null,}} resizeMode={Image.resizeMode.contain}/>

2

A largura e a altura com valor nulo não funcionam para mim, então pensei em usar a posição superior, inferior, esquerda e direita e funcionou. Exemplo:

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

E o JSX:

<Image style={styles.bg} source={{uri: 'IMAGE URI'}} />

2

(RN> = 0,46)

o componente não pode conter filhos se você deseja renderizar o conteúdo na parte superior da imagem, considere usar o posicionamento absoluto.

ou você pode usar o 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

Maneira mais fácil de implementar o plano de fundo:

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

2

Para mim, isso funciona bem, usei o ImageBackground para definir a imagem de fundo:

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

caso você ainda não tenha resolvido, o React Native v.0.42.0 tem 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,
  }
});

Você pode experimentá-lo em: https://sketch.expo.io/B1EAShDie (de: github.com/Dorian/sketch-reactive-native-apps )

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


1

Você também pode usar sua imagem como um contêiner:

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

Ouvi dizer que é necessário usar o BackgroundImage porque, no futuro, você não poderá aninhar a tag Image. Mas não consegui que o BackgroudImage exibisse adequadamente meu plano de fundo. O que fiz foi aninhar minha imagem dentro de uma tag View e estilizar a vista externa e a imagem. As chaves estavam configurando a largura como nula e definindo resizeMode como 'esticar'. Abaixo está o meu código:

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

Use <ImageBackground>como já dito por antoine129 . O uso <Image>com crianças está obsoleto agora.

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

Outra solução fácil:

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

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

  {/*rest of your content*/}
</View>

0

Resolvi meu problema de imagem de plano de fundo usando esse código.

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 pode ter limite

Na verdade, você pode usar diretamente e não é preterido.

Se você deseja adicionar uma imagem de plano de fundo no React Native e também deseja adicionar outros elementos nessa imagem de plano de fundo, siga a etapa abaixo:

  1. Criar uma exibição de contêiner
  2. Crie um elemento de imagem com 100% de largura e altura. Também resizeMode: 'Cover'
  3. Crie outro elemento View em Image elemento com a posição: 'absolute'

Este é o código que eu uso:

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

Desfrute de codificação ....

Resultado:

Esta é a saída do meu código.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.