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?

talpaz
fonte
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á.

Josh
fonte
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,
  }
};
oronbz
fonte
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>
Vinod Sobale
fonte
O que é isso oficialmente suportado?
rclai
1
Sim. Isto é. facebook.github.io/react-native/docs/…
Vinod Sobale
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!

Aba
fonte
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 >
Hitesh Sahu
fonte
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>
Ryan Wu
fonte
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.

antoine129
fonte
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

Pawel Sas
fonte
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

Ali Esfandiari
fonte
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

Braden Rockwell Napier
fonte
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.

TPM ABDULKAREEM
fonte
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}/>
Eric Kim
fonte
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'}} />
dap1995
fonte
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'
    },
});

Hamid Reza Salimian
fonte
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
  }
});
Ahmad Sadiq
fonte
2
 import { ImageBackground } from "react-native";
 <ImageBackground
      style={{width: '100%', height: '100%'}}
          source={require('../assets/backgroundLogin.jpg ')}> //path here inside
          <Text>React</Text>
        </ImageBackground>
Naved Khan
fonte
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;
Abdul Karim Khan
fonte
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')} />
user7103816
fonte
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

Dorian
fonte
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',
      },
});
Agu Dondo
fonte
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',
		}
});

Chris Adams
fonte
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,
  }
};
Aung Myat Hein
fonte
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>
Serdar Değirmenci
fonte
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'
     }
   });
Adeel Ahmed Baloch
fonte
-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.

Chhay Rith Hy
fonte