Apa cara terbaik untuk menambahkan gambar latar belakang layar penuh di React Native

149

Saya ingin menambahkan gambar layar penuh ke tampilan jadi saya menulis kode ini

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

dan mendefinisikan gaya sebagai

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

tetapi dengan cara ini bagaimana saya bisa menemukan ukuran layar iPhone yang sebenarnya?

Saya telah melihat API untuk mengakses Pixel Density tetapi tidak ada tentang ukuran layar ...

Ada ide?

talpaz
sumber
Bagaimana dengan kinerja? Apakah boleh menggunakan .pngatau tidak .jpg? Apakah boleh menyimpan gambar wallpaper di dalam pohon direktori aplikasi? Atau lebih baik menggunakan sesuatu yang lain? .svgatau apapun?
Hijau

Jawaban:

113

Anda dapat menggunakan flex: 1gaya pada <Image>elemen untuk mengisi seluruh layar. Anda kemudian dapat menggunakan salah satu mode Ubah ukuran gambar agar gambar sepenuhnya mengisi elemen:

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

Gaya:

import React from 'react-native';

let { StyleSheet } = React;

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

Saya cukup yakin Anda dapat menyingkirkan <View>pembungkus gambar Anda dan ini akan berhasil.

Josh
sumber
1
Yup, itu berfungsi, saya telah memindahkan elemen gambar sebagai yang paling atas dan mengatur gayanya sebagai backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, },Terima kasih
talpaz
4
Setelah berjuang dengan ini untuk sementara waktu saya merasa lebih mudah untuk membungkus Imagekomponen dalam posisi yang benar-benar Viewmemungkinkan gambar latar belakang muncul di belakang konten lain di layar.
Josh Habdas
3
Sunting penting: <Image src=...>sekarang<Image source=...>
Nama pengguna
Sekarang z-index didukung, apakah Anda akan mengubah jawaban ini?
makenova
Tidak apa-apa tapi gambarnya melebar dan gulir diaktifkan di layar
Ananta Prasad
178

(Ini sudah ditinggalkan sekarang Anda dapat menggunakan ImageBackground )

Beginilah cara saya melakukannya. Kesepakatan utama adalah menyingkirkan ukuran tetap statis.

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
sumber
1
Ya, begitulah seharusnya dilakukan oleh docs facebook.github.io/react-native/docs/…
Daniel Steigerwald
16
Ini jawaban terbaik!
Vanson Wing Leung
3
Terima kasih! Pastikan Imagekomponen pertama Anda dikembalikan, wadah. Pada awalnya, saya tidak sengaja bersarang di Imagedalam Viewwadah itu.
Glavin001
6
YellowBox.js: 76 Menggunakan <Image> dengan anak-anak sudah usang dan akan menjadi kesalahan dalam waktu dekat. Harap pertimbangkan kembali tata letak atau gunakan <ImageBackground>. Ketika saya menambahkan konten ke <Image>, peringatan ini muncul. itu sangat menjengkelkan.
Benjamin Wen
4
ini sebenarnya sudah usang. Gunakan ImageBackground atau posisi (terbaik): absolut
Mike
43

Catatan: Solusi ini sudah tua. Silakan merujuk ke https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting sebagai gantinya

Coba solusi ini. Secara resmi didukung. Saya baru saja mengujinya dan bekerja dengan sempurna.

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

Dan untuk menggunakannya sebagai gambar Background, lakukan saja hal berikut.

<Image style={styles.backgroundImage}>
  <View>
    <Text>All your stuff</Text>
  </View>
</Image>
Vinod Sobale
sumber
Apa, apakah ini didukung secara resmi?
rclai
1
Iya. Ini. facebook.github.io/react-native/docs/…
Vinod Sobale
Apa gunanya alignSelfdan di widthsini?
Harkirat Saluja
Anda meregangkan <Gambar /> ke lebar yang tersedia dan lebar harus memiliki null agar 'peregangan' bekerja
Vinod Sobale
FYI, Komponen gambar tidak dapat memiliki anak dalam React versi terbaru (0.51.0). Ini tidak lagi berfungsi.
rplankenhorn
20

Saya mencoba beberapa jawaban ini tanpa hasil untuk android menggunakan versi react-native = 0.19.0.

Untuk beberapa alasan, metode resizeMode di dalam stylesheet saya tidak berfungsi dengan benar? Namun, saat sytlesheet sudah

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

dan, dalam tag gambar saya tentukan resizeMode:

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

Itu bekerja dengan sempurna! Seperti disebutkan di atas, Anda dapat menggunakan Image.resizeMode.cover atau mengandung juga.

Semoga ini membantu!

Tab
sumber
16

Pembaruan Maret 2018 Menggunakan Gambar tidak digunakan lagi menggunakan 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
sumber
1
Ini benar, sekarang Anda harus menggunakan ImageBackground, Gambar sebagai wadah sudah usang. Lihat sebagai wadah di sini tidak diperlukan, Anda hanya dapat menggunakan ImageBackground sebagai wadah utama.
Diego Unanue
13

Berdasarkan Braden Rockwell Napier 's jawaban , saya membuat ini BackgroundImagekomponen

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
sumber
12

PEMBARUAN ke ImageBackground

Karena penggunaan <Image />sebagai wadah sudah tidak digunakan lagi untuk sementara waktu, semua jawaban sebenarnya melewatkan sesuatu yang penting. Untuk penggunaan yang tepat pilih <ImageBackground />dengan style dan imageStyle penyangga. Terapkan semua gaya yang relevan dengan Gambar imageStyle.

Sebagai contoh:

<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
sumber
11

Jika Anda ingin menggunakannya sebagai gambar latar belakang, Anda harus menggunakan <ImageBackground>komponen baru yang diperkenalkan pada akhir Juni 2017 di v0.46. Ini mendukung bersarang sementara tidak <Image>lama lagi.

Berikut ini ringkasan komit :

Kami sedang menghapus dukungan pandangan bersarang di dalam komponen. Kami memutuskan untuk melakukan ini karena memiliki fitur ini membuat pendukung intrinsinc content sizeyang <Image>tidak mungkin; jadi ketika proses transisi selesai, tidak perlu menentukan ukuran gambar secara eksplisit, itu dapat disimpulkan dari bitmap gambar yang sebenarnya.

Dan ini adalah langkah # 0.

adalah pengganti drop-in yang sangat sederhana yang mengimplementasikan fungsi ini melalui gaya yang sangat sederhana. Silakan, gunakan alih-alih jika Anda ingin memasukkan sesuatu ke dalam.

antoine129
sumber
9

Oh Tuhan Akhirnya saya menemukan cara yang bagus untuk React-Native V 0.52-RC dan asli-basis:

Tag Konten Anda Harus seperti ini: // ======================================= =======================

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

Dan gaya penting Anda adalah: // ========================================== ====================

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

Berhasil teman baik ... bersenang-senang

Ali Esfandiari
sumber
Hai, Hanya ingin memastikan ImageBackground dari mana itu diimpor?
Rudolph Opperman
OK jadi ImageBackground saya mengimpor dari react-asli namun, saya tidak dapat mengatur dengan: 100%
Rudolph Opperman
Apakah Anda pernah mengalami masalah saat ditampilkan di Android Emulator tetapi tidak di perangkat?
Rudolph Opperman
Maaf atas jawaban saya yang terlambat, Anda dapat Mengimpor ImageBackground dari React Native: import {ImageBackground} dari 'react-native'; perangkat penyihir apakah Anda menguji? Saya tidak menemukan masalah pada perangkat.
Ali Esfandiari
Emulator saya adalah spesifikasi Nexus 5. Dan android saya adalah Wileyfox Swift. Perbedaan utama adalah resolusi jadi saya memeriksanya pada gambar dan sepertinya jika resolusi gambar lebih tinggi maka perangkat Anda tidak ditampilkan. Saya mencoba membuat gambar lebih kecil dengan gaya tetapi tidak berhasil jadi saya mengubah resolusi pada gambar yang lebih rendah dan sekarang sepertinya berfungsi dengan baik. Resolusi yang lebih rendah bukan masalah karena itu adalah layar masuk dan ada beberapa input teks dan tombol di atasnya. Terima kasih banyak.
Rudolph Opperman
4

Karena 0.14 metode ini tidak akan berfungsi, jadi saya membangun komponen statis yang akan membuat ini mudah bagi kalian. Anda bisa menempelkan ini di atau referensi sebagai komponen.

Ini harus digunakan kembali dan itu akan memungkinkan Anda untuk menambahkan gaya dan properti tambahan seolah-olah itu adalah <Image />komponen standar

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

cukup tempel ini dan kemudian Anda dapat menggunakannya seperti gambar dan itu harus sesuai dengan seluruh ukuran tampilan yang ada di dalamnya (jadi jika itu adalah tampilan teratas itu akan mengisi layar Anda.

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

Klik di sini untuk Gambar Pratinjau

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

Untuk menangani kasus penggunaan ini, Anda dapat menggunakan <ImageBackground>komponen, yang memiliki alat peraga yang sama dengan <Image>, dan menambahkan anak-anak apa pun ke dalamnya yang ingin Anda lapisan di atasnya.

Contoh:

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

Untuk lebih lanjut: ImageBackground | Bereaksi Asli

Perhatikan bahwa Anda harus menentukan beberapa atribut gaya lebar dan tinggi.

TPM ABDULKAREEM
sumber
2

Anda perlu memastikan bahwa Gambar Anda telah resizeMode = {Image.resizeMode.contain} atau {Image.resizeMode.stretch} dan atur lebar gaya gambar ke nol

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

Lebar dan tinggi dengan nilai nol tidak berfungsi untuk saya, maka saya berpikir untuk menggunakan posisi atas, bawah, kiri, dan kanan dan berhasil. Contoh:

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

Dan BEJ:

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

(RN> = .46)

komponen tidak dapat berisi anak-anak jika Anda ingin membuat konten di atas gambar, pertimbangkan untuk menggunakan penentuan posisi absolut.

atau Anda bisa menggunakan 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
sumber
2

Cara termudah untuk menerapkan latar belakang:

<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
sumber
2

Bagi saya ini berfungsi dengan baik, saya menggunakan ImageBackground untuk mengatur gambar latar belakang:

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
sumber
1

Jika Anda belum menyelesaikannya, React Native v.0.42.0 memiliki resizeMode

<Image style={{resizeMode: 'contain'}} source={require('..img.png')} />
pengguna7103816
sumber
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,
  }
});

Anda dapat mencobanya di: https://sketch.expo.io/B1EAShDie (dari: github.com/Dorian/sketch-reactive-native-apps )

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

Dorian
sumber
1

Anda juga dapat menggunakan gambar Anda sebagai wadah:

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
sumber
1

Saya pernah mendengar tentang harus menggunakan BackgroundImage karena di masa depan Anda seharusnya tidak dapat membuat tag Gambar. Tapi saya tidak bisa mendapatkan BackgroudImage untuk menampilkan latar belakang saya dengan benar. Apa yang saya lakukan adalah menumpuk gambar saya di dalam tag tampilan dan gaya tampilan luar serta gambar. Tombol-tombol mengatur lebar ke nol, dan mengatur ukurannya ke 'peregangan'. Di bawah ini adalah kode saya:

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
sumber
1

Gunakan <ImageBackground>seperti yang sudah dikatakan oleh antoine129 . Menggunakan <Image>dengan anak-anak sudah ditinggalkan sekarang.

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
sumber
0

Solusi mudah lain:

<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
sumber
0

Saya memecahkan masalah gambar latar belakang saya menggunakan kode ini.

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
sumber
-1

ImageBackground mungkin memiliki batas

Sebenarnya, Anda dapat menggunakan secara langsung dan itu tidak usang.

Jika Anda ingin menambahkan Gambar Latar Belakang dalam Bereaksi Asli dan juga ingin menambahkan elemen lain pada Gambar Latar Belakang itu, ikuti langkah di bawah ini:

  1. Buat Tampilan Kontainer
  2. Buat elemen Gambar dengan lebar dan tinggi 100%. Juga resizeMode: 'Sampul'
  3. Buat elemen tampilan lain di bawah elemen gambar dengan posisi: 'absolut'

Ini adalah kode yang saya gunakan:

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

Nikmati Pengodean ....

Keluaran:

Ini adalah output dari kode saya.

Chhay Rith Hy
sumber