39

当我在 react-native 中使用时,它会警告说不推荐使用与孩子一起使用,并且将来会出错。取而代之的是用户。

所以,如果我使用它不会给出我正在使用的预期结果

这是我为使用而编写的代码

<ImageBackground source={require('../../img/splash/splash_bg.png')} style={styles.backgroundImage} >
        </ImageBackground>

样式代码是

const styles = StyleSheet.create({
backgroundImage: {
    flex: 1,
    // width: undefined,
    // height: undefined,
    // flexDirection: 'column',
    // backgroundColor:'transparent',
    // justifyContent: 'flex-start',


},}

预期结果:使用 <Image> 时得到 结果使用 <ImageBackground>

4

14 回答 14

69

你可以在 React Native 上使用“ImageBackground”组件。

<ImageBackground
  source={yourSourceFile}
  style={{width: '100%', height: '100%'}}
> 
    <....yourContent...>
</ImageBackground>
于 2017-11-15T20:27:58.930 回答
21

我通过以下方式实现了这一目标:

import { ImageBackground } from 'react-native';

<ImageBackground style={ styles.imgBackground } 
                 resizeMode='cover' 
                 source={require('./Your/Path.png')}>

   //place your now nested component JSX code here

</ImageBackground>

然后是样式:

imgBackground: {
        width: '100%',
        height: '100%',
        flex: 1 
},
于 2018-05-08T12:16:44.160 回答
4

两种选择:

  1. 尝试将宽度和高度设置为设备屏幕的宽度和高度
  2. 好老位置绝对

#2 的代码:

 render(){
    return(
        <View style={{ flex: 1 }}>
           <Image style={{ width: screenWidth, height: screenHeight, position: 'absolute', top: 0, left: 0 }}/>
           <Text>Hey look, image background</Text>
        </View>
    )
}

编辑:对于选项#2,您可以尝试resizeMode="stretch|cover"

编辑 2:请记住,选项 #2 渲染图像,然后按此顺序渲染之后的所有内容,这意味着某些像素被渲染两次,这可能会对性能产生非常小的影响(通常不明显),但仅供您参考

于 2017-10-23T13:11:20.850 回答
2

这是 RN 文档的链接:https ://facebook.github.io/react-native/docs/images

来自熟悉 Web 的开发人员的常见功能请求是背景图像。要处理这个用例,您可以使用与<ImageBackground>具有相同道具的组件,<Image>并添加您想要在其上分层的任何子组件。

在某些情况下您可能不想使用<ImageBackground>,因为实现非常简单。请参阅<ImageBackground>的源代码以获取更多信息,并在需要时创建您自己的自定义组件。

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

请注意,您必须指定一些宽度和高度样式属性。

另请注意,文件路径是相对于组件所在的目录的。

于 2018-07-20T05:28:26.827 回答
2

ImageBackground是一个非常简单实用的组件。将您的组件ImageBackground作为嵌套组件放入其中,并使用position.

这是一个例子。

<ImageBackground
  source={{ uri: hoge }}
  style={{
    height: 100,
    width: 100,
    position: 'relative', 
    top: 0,
    left: 0
  }}
>
  <Text
    style={{
      fontWeight: 'bold',
      color: 'white',
      position: 'absolute', 
      bottom: 0, 
      left: 0
    }}
  >
    Hello World
  </Text>
</ImageBackground>

于 2018-07-12T05:36:54.773 回答
1

添加背景Image,React Native是基于组件的,ImageBackground组件需要两个props style={{}}source={require('')}

 <ImageBackground source={require('./wallpaper.jpg')} style={{width: '100%', height: '100%'}}> 
<....yourContent Goes here...>
    </ImageBackground>
于 2018-12-22T13:51:50.303 回答
1
     <ImageBackground
            source={require("../assests/background_image.jpg")}
            style={styles.container}

        >
            <View
                style={{
                    flex: 1,
                    justifyContent: "center",
                    alignItems: "center"
                }}
            >
                <Button
                    onPress={() => this.props.showImagePickerComponent(this.props.navigation)}
                    title="START"
                    color="#841584"
                    accessibilityLabel="Increase Count"
                />
            </View>
        </ImageBackground>

请使用此代码在本机反应中设置背景图像

于 2018-05-08T09:38:40.817 回答
1
const img = '../../img/splash/splash_bg.png';
<ImageBackground  source={{ uri: img }} style={styles.backgroundImage} >
    </ImageBackground>

这对我有用。可以在这里找到对 RN 文档的参考。我通过阅读这个来写我的 - https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting

于 2018-12-06T13:17:41.510 回答
0

我在背景图像及其子组件(包括徽标图像)方面遇到了同样的问题。浪费了几个小时后,我找到了解决这个问题的正确方法。这肯定对你有帮助。

var {View, Text, Image, ImageBackground} = require('react-native');
import Images from '@assets';

export default class Welcome extends Component {
    render() {
        return (
            <ImageBackground source={Images.main_bg} style={styles.container}>
                <View style={styles.markWrap}>
                    <Image source={Images.main_logo} 
                    style={styles.mark} resizeMode="contain" />
                </View>
                <View style={[styles.wrapper]}>
                    {//Here put your other components}
                </View>              
                
            </ImageBackground>
        );
    }
}

var styles = StyleSheet.create({
    container:{
        flex: 1,
    },
    markWrap: {
        flex: 1,
        marginTop: 83,
        borderWidth:1, borderColor: "green"
      },
    mark: {
        width: null,
        height: null,
        flex: 1,
    },
    wrapper:{
        borderWidth:1, borderColor: "green",///for debug
        flex: 1,
        position:"relative",
    },
}

背景图像上的徽标

(PS:我在这个屏幕上放的是虚拟图像而不是真实的公司标志。)

于 2018-06-18T11:58:15.347 回答
0

我想这会帮助你..

import React, { Component } from 'react';
import { homePageStyles } from '../styles/Style';
import { Text, ImageBackground } from 'react-native';
import HomePageWallpaper from '../images/homePageWallpaper.jpg';

export default class Home extends Component {
    render() {
        return (
            <ImageBackground source={HomePageWallpaper} style={{ flex: 1, justifyContent: 'center', width: null, height: null }}>
                <Container>                    
                    <Content>
                        <Text style={homePageStyles.description_text}>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</Text>
                    </Content>
                </Container >
            </ImageBackground>
        );
    }
}
于 2018-05-29T13:09:54.403 回答
0
const { width, height } = Dimensions.get('window')


<View style={{marginBottom: 20}}>
   <Image 
        style={{ height: 200, width: width, position: 'absolute', resizeMode: 'cover' }}
        source={{ uri: 'https://picsum.photos/'+width+'/200/?random' }}
                />
   <View style={styles.productBar}>
       <View style={styles.productElement}>
            <Image
                  style={{ height: 160, width: width - 250, position: 'relative', resizeMode: 'cover' }}
                  source={{ uri: 'https://picsum.photos/'+ 250 +'/160/?random' }}
                        />
       </View>
       <View style={styles.productElement}>
             <Text style={{ fontSize: 16, paddingLeft: 20 }}>Başlık</Text>
             <Text style={{ fontSize: 12, paddingLeft: 20, color: "blue"}}>Alt Başlık</Text>
       </View>
   </View>
</View>



 productBar: {
    margin: 20,
    marginBottom: 0,
    justifyContent: "flex-start" , 
    flexDirection: "row"
  },
  productElement: {
    marginBottom: 0, 
 },

截屏

于 2018-04-22T18:39:47.507 回答
0

我在谷歌上搜索如何在 2021 年实现这一目标,所以我将继续添加我是如何实现这一目标的。注意:我styled-components在我的项目中使用。另一件要提的是,您可能不需要额外的View组件,但我正在使用SafeAreaView组件内部的Background组件来在 iOS 的状态栏下方添加额外的间距。

import styled from 'styled-components';

const Background = styled.ImageBackground`
  flex: 1;
  resize-mode: cover; // Not sure if this helps, but it was used in the docs, listed below
  justify-content: center;
`;

const Container = styled.SafeAreaView`
  flex: 1;
`;

...
return (
  <Background source={require('../assets/image.png')}>
    <Container>
      // rest of your components
    </Container>
  </Background>
)
...

文档

于 2021-04-02T20:05:06.140 回答
0

您必须先导入背景组件才能在代码中使用 backgroundimage

于 2020-07-31T19:40:18.257 回答
-7
.hero-image {
  background-image: url("photographer.jpg"); /* The image used */
  background-color: #cccccc; /* Used if the image is unavailable */
  height: 500px; /* You must set a specified height */
  background-position: center; /* Center the image */
  background-repeat: no-repeat; /* Do not repeat the image */
  background-size: cover; /* Resize the background image to cover the entire container */
}

看结果

于 2019-01-31T14:51:20.013 回答