在React Native中添加全屏背景图像的最佳方法是什么


148

我想在视图中添加全屏图像,所以我编写了这段代码

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

并将样式定义为

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

但是以这种方式应该如何找到iPhone的实际屏幕尺寸?

我已经看到了用于访问像素密度的API,但是与屏幕尺寸无关...

任何想法?


性能如何?它是确定使用.png.jpg?是否可以在应用程序目录树中存储墙纸图像?还是使用其他东西更好?.svg还是什么?
绿

Answers:


113

您可以flex: 1<Image>元素上使用样式以使其覆盖整个屏幕。然后,可以使用“图像调整大小”模式之一使图像完全填充元素:

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

样式:

import React from 'react-native';

let { StyleSheet } = React;

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

我敢肯定,您可以摆脱<View>包装图片的麻烦,并且可以使用。


1
是啊,它的工作原理,我搬到图像元素作为最顶层,并设置其风格为 backgroundImage:{ justifyContent: 'center', alignItems: 'center', flex: 1, resizeMode: Image.resizeMode.contain, },感谢
talpaz

4
经过一段时间的努力,我发现将Image组件包装在绝对位置最容易,View以使背景图像出现在屏幕上其他内容的后面。
2015年

3
重要编辑:<Image src=...>现在<Image source=...>
用户名

现在已经支持z-index,您会更改此答案吗?
makenova

很好,但是图像正在拉伸并且在屏幕上启用了滚动
Ananta Prasad

177

(现已弃用,现在您可以使用ImageBackground

这就是我做到的方式。主要的工作是摆脱静态的固定大小。

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
是的,就是应该如何通过文档进行facebook.github.io/react-native/docs/...
丹尼尔的Steigerwald

15
这是最好的答案!
Vanson Wing Leung

3
谢谢!确保Image是第一个返回的组件,即容器。一开始,我不小心将嵌套Image在了View那个容器中。
Glavin001

6
YellowBox.js:76不建议将<Image>与孩子一起使用,并且在不久的将来会出现错误。请重新考虑布局或使用<ImageBackground>。当我将内容添加到<Image>时,出现此警告。真烦人。
本杰明·文

4
这实际上已被弃用。使用ImageBackground或(最佳)位置:绝对
麦克

43

注意:此解决方案很旧。请 改为参考https://facebook.github.io/react-native/docs/images.html#background-image-via-nesting

试试这个解决方案。它得到官方支持。我刚刚对其进行了测试,并且可以完美地工作。

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

至于将其用作背景图像,只需执行以下操作。

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

什么,这是官方支持的吗?
rclai


alignSelfwidth在这里有什么用?
Harkirat Saluja'1

您正在将<Image />拉伸到可用宽度,并且宽度必须为null才能使“拉伸”正常工作
Vinod Sobale

仅供参考,在最新版本的React(0.51.0)中,图像组件不能有子级。这不再起作用。
rplankenhorn

20

我使用react-native version = 0.19.0尝试了这些答案中的几个对android无济于事。

由于某种原因,样式表中的resizeMode无法正常工作?然而,当sytlesheet有

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

并且,在Image标签中,我指定了resizeMode:

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

效果很好!如上所述,您可以使用Image.resizeMode.cover或包含。

希望这可以帮助!


16

2018年3月更新不推荐使用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
这是正确的,现在您必须使用ImageBackground,因为不推荐使用容器作为图像。在这里不需要作为容器查看,您可以仅使用ImageBackground作为主要容器。
Diego Unanue

13

根据Braden Rockwell Napier回答,我做了这个BackgroundImage组件

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

如果要将其用作背景图像,则需要使用v0.46 中于20176月底引入的新<ImageBackground>组件。它支持嵌套,但不久将不支持。<Image>

这是提交摘要:

我们正在删除对组件内部嵌套视图的支持。我们决定这样做,因为具有这种特性使得配套 intrinsinc content size<Image>不可能的; 因此,当过渡过程完成时,无需显式指定图像大小,可以从实际图像位图推断出来。

这是步骤#0。

是非常简单的直接替换,它通过非常简单的样式来实现此功能。请使用代替,如果您想在里面放东西。


11

更新到ImageBackground

由于<Image />不推荐使用容器一段时间,因此所有答案实际上都遗漏了一些重要内容。为了正确使用选择<ImageBackground />style imageStyle支撑。将所有与图像相关的样式应用于imageStyle

例如:

<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

噢,天哪,最后我找到了一种用于React-Native V 0.52-RC和native-base的好方法:

您的内容标签应该是这样的:// ======================================= =======================

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

而您的基本风格是:// ========================================== ====================

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

好朋友...很开心


嗨,只想确保ImageBackground是从哪里导入的?
鲁道夫·奥珀曼

好的,所以我从react-native导入了ImageBackground,但是,我无法设置:100%
Rudolph Opperman

您是否遇到过在Android Emulator上显示但不在设备上显示的问题?
鲁道夫·奥珀曼

对不起,我的回答很晚,您可以从React Native导入ImageBackground:从'react-native'导入{ImageBackground}; 你测试过女巫装置吗?我在设备上没有发现任何问题。
阿里·埃斯凡迪亚里18'Mar

我的仿真器是Nexus 5规格。我的机器人是Wileyfox Swift。主要区别在于分辨率,因此我在图像上进行了检查,好像图像分辨率较高,则设备无法显示。我尝试使用样式缩小图像,但是没有用,所以我降低了图像的分辨率,现在看起来可以正常工作。较低的分辨率并不是真正的问题,因为它是一个登录屏幕,上面有一些文本输入和按钮。非常感谢你。
鲁道夫·奥珀曼

4

从0.14开始,此方法将不起作用,因此我构建了一个静态组件,该组件对您而言非常简单。您可以将其粘贴或引用为组件。

这应该是可重用的,并且允许您添加其他样式和属性(如果它是标准<Image />组件)

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

只需将其粘贴,然后就可以像图像一样使用它,并且它应该适合其所在视图的整个大小(因此,如果它是顶视图,它将填满您的屏幕。

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

单击此处查看预览图像



3

要处理此用例,您可以使用<ImageBackground>具有与道具相同的道具的组件,<Image>并向其中添加任何您想在其上分层的子项。

例:

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

有关更多信息:ImageBackground | 反应本机

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


2

您需要确保您的图片具有resizeMode = {Image.resizeMode.contain}或{Image.resizeMode.stretch}并将图片样式宽度设置为null

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

2

值为null的宽度和高度对我不起作用,所以我认为使用顶部,底部,左侧和右侧位置就可以了。例:

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

和JSX:

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

2

(RN> = .46)

如果要在图像顶部渲染内容,则该组件不能包含子代,请考虑使用绝对定位。

或者您可以使用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

实现背景的最简单方法:

<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

对我来说,这很好用,我使用ImageBackground设置了背景图片:

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;

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

1

如果您还没有解决,React Native v.0.42.0具有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,
  }
});

您可以在以下网址尝试:https : //sketch.expo.io/B1EAShDie(来自:github.com/Dorian/sketch-reactive-native-apps

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


1

您还可以将图像用作容器:

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

我听说过必须使用BackgroundImage,因为将来应该无法嵌套Image标签。但是我无法让BackgroudImage正确显示我的背景。我所做的就是将Image嵌套在View标记内,并对外部View和图像进行样式设置。关键是将width设置为null,将resizeMode设置为“ stretch”。下面是我的代码:

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

使用<ImageBackground>前面已经说了通过antoine129。使用<Image>与孩子们现在已经过时了。

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

另一个简单的解决方案:

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

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

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

0

我使用此代码解决了我的背景图片问题。

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可能有限制

实际上,您可以直接使用它,并且不推荐使用。

如果要在React Native中添加背景图像,并且还想在该背景图像上添加其他元素,请按照以下步骤操作:

  1. 创建一个容器视图
  2. 创建具有100%宽度和高度的Image元素。同样resizeMode:'Cover'
  3. 在位置为“绝对”的“图像”元素下创建另一个“视图”元素

这是我使用的代码:

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

享受编码...

输出:

这是我的代码的输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.