¿Cuál es la mejor manera de agregar una imagen de fondo de pantalla completa en React Native?

6 minutos de lectura

avatar de usuario de talpaz
talpaz

Quería agregar una imagen de pantalla completa a la Vista, así que escribo este código

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

y definió el estilo como

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

pero de esta manera, ¿cómo se supone que debo encontrar el tamaño real de la pantalla del iPhone?

He visto una API para acceder a la densidad de píxeles, pero nada sobre el tamaño de la pantalla…

¿Alguna idea?

  • ¿Qué tal el rendimiento? ¿Está bien usar .png o .jpg? ¿Está bien almacenar la imagen del fondo de pantalla dentro del árbol de directorios de la aplicación? ¿O es mejor usar otra cosa? .svg ¿o algo?

    – Verde

    4 de julio de 2018 a las 15:57

  • @Sabito 錆兎standswithUkraine El criterio de React Native es fundamental para la pregunta. por lo que pertenece en el título.

    – TylerH

    hace 2 días

avatar de usuario de oronbz
oronbz

(Esto ha quedado en desuso ahora puede usar ImagenFondo)

Así es como lo he hecho. El trato principal fue deshacerse de los tamaños fijos 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,
  }
};

  • Sí, así es como deben hacerlo los documentos. facebook.github.io/react-native/docs/…

    –Daniel Steigerwald

    19/10/2015 a las 21:47

  • ¡Gracias! Asegúrate que Image es su primer componente devuelto, el contenedor. Al principio, anidé accidentalmente el Image Dentro de un View ese era el contenedor.

    – Glavin001

    18 mayo 2016 a las 19:50


  • ¿Esto funciona con facebook.github.io/react-native/docs/tabbarios.html como contenido. No me funciona, no se puede hacer clic en las pestañas

    – divyenduz

    29/10/2016 a las 19:47

  • YellowBox.js:76 El uso de con niños está en desuso y será un error en el futuro cercano. Reconsidere el diseño o use en su lugar. Cuando agrego contenido a , aparece esta advertencia. Es muy molesto.

    – Benjamín Wen

    1 de agosto de 2017 a las 4:01

  • esto es en realidad obsoleto. Use ImageBackground o (mejor) posición: absoluta

    – Michele

    3 de diciembre de 2017 a las 14:14

Avatar de usuario de Josh
jose

Puedes usar flex: 1 estilo en un <Image> para que ocupe toda la pantalla. Luego puede usar uno de los modos de cambio de tamaño de imagen para que la imagen llene completamente el 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'
  }
});

Estoy bastante seguro de que puedes deshacerte de la <View> envolviendo tu imagen y esto funcionará.

  • Sí, funciona, moví el elemento de la imagen como el más alto y configuré su estilo como backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, }, Gracias

    – talpaz

    28 de marzo de 2015 a las 23:47


  • Después de luchar con esto por un tiempo, encontré que era más fácil envolver el Image componente en posición absoluta View para permitir que la imagen de fondo aparezca detrás de otro contenido en la pantalla.

    – vhs

    29 mayo 2015 a las 19:42


  • Edición importante: <Image src=...> es ahora <Image source=...>

    – Nombre de usuario

    28 de enero de 2016 a las 2:28

  • Ahora que se admite el índice z, ¿cambiaría esta respuesta?

    – makenova

    24 de julio de 2016 a las 22:13

  • Está bien, pero la imagen se estira y el desplazamiento está habilitado en la pantalla.

    – Ananta Prasad

    13 de junio de 2018 a las 11:17

Avatar de usuario de Vinod Sobale
Vinod Sobalé

Nota: Esta solución es antigua. Por favor refiérase a https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting en cambio

Pruebe esta solución. Se apoya oficialmente. Lo acabo de probar y funciona perfectamente.

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

Y en cuanto a usarlo como imagen de fondo, simplemente haga lo siguiente.

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

  • ¿Qué, es esto oficialmente compatible?

    – rcai

    2 de diciembre de 2015 a las 18:08

  • Sí. Está. facebook.github.io/react-native/docs/…

    – Vinod Sobalé

    30 de enero de 2016 a las 9:38

  • Cuál es el uso de alignSelf y width ¿aquí?

    – Harkirat Saluja

    4 de enero de 2017 a las 11:21

  • Está estirando al ancho disponible y el ancho debe tener un valor nulo para que ‘estirar’ funcione

    – Vinod Sobalé

    4 de enero de 2017 a las 11:54

  • FYI, los componentes de imagen no pueden tener hijos en la última versión de React (0.51.0). Esto ya no funciona.

    – rplankenhorn

    13 de diciembre de 2017 a las 13:18

Actualización de marzo de 2018 El uso de la imagen está en desuso 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 >

Probé varias de estas respuestas en vano para Android usando la versión nativa de reacción = 0.19.0.

¿Por alguna razón, el resizeMode dentro de mi hoja de estilo no funcionó correctamente? Sin embargo, cuando la hoja de estilo tenía

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

y, dentro de la etiqueta de la imagen, especifiqué el resizeMode:

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

¡Funcionó perfectamente! Como se mencionó anteriormente, puede usar Image.resizeMode.cover o contener también.

¡Espero que esto ayude!

Avatar de usuario de Pawel
Pawel

ACTUALIZAR a ImageBackground

Desde que usa <Image /> como un contenedor está en desuso por un tiempo, todas las respuestas en realidad pierden algo importante. Para un uso adecuado, elija <ImageBackground /> con style y imageStyle apuntalar. Aplicar todos los estilos relevantes de la imagen a imageStyle.

Por ejemplo:

<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

Avatar de usuario de la comunidad
Comunidad

Basado en la respuesta de Braden Rockwell Napier, hice esto BackgroundImage componente

Imagen de fondo.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

algúnDóndeEnMiAplicación.js

 import BackgroundImage from './backgroundImage'
 ....
 <BackgroundImage source={ { uri: "https://facebook.github.io/react-native/img/header_logo.png" } }>
    <Text>Test</Text>
 </BackgroundImage>

¿Ha sido útil esta solución?