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または何か?
グリーン

回答:


112

要素にflex: 1スタイリングを使用して、<Image>要素を画面全体に表示させることができます。次に、画像のサイズ変更モードの1つを使用して、画像が要素を完全に埋めるようにします。

<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, },
うん、うまくいきました。Image

4
しばらくこれに取り組んだ後、Imageコンポーネントを絶対位置でラップしてView、背景画像が画面上の他のコンテンツの背後に表示されるようにするのが最も簡単であることがわかりました。
Josh Habdas、2015年

3
重要な編集:<Image src=...>現在<Image source=...>
ユーザー名

z-indexがサポートされたので、この答えを変更しますか?
makenova

それは結構ですが、画像が伸びていると、スクロールは、画面で有効になっている
アナンタプラサド

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/...
ダニエルシュタイガーヴァルト

15
これがベストアンサーです。
Vanson Wing Leung、

3
ありがとうございました!Image返される最初のコンポーネントがコンテナであることを確認してください。最初に、コンテナーであるImage内に誤ってをネストしましたView
Glavin001 2016年

6
YellowBox.js:76子での<Image>の使用は非推奨であり、近い将来エラーになります。レイアウトを再検討するか、代わりに<ImageBackground>を使用してください。<Image>にコンテンツを追加すると、この警告が表示されます。それは本当に迷惑です。
Benjamin Wen 2017

4
これは実際には非推奨です。ImageBackgroundまたは(最良の)position:absoluteを使用
Mike

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 2017

<Image />を利用可能な幅にストレッチし、「ストレッチ」が機能するためには、幅にnullが必要です
Vinod Sobale

参考までに、最新バージョンのReact(0.51.0)では、イメージコンポーネントに子を含めることはできません。これはもう機能しません。
rplankenhorn 2017

20

私はこれらの答えのいくつかを試してみましたが、反応ネイティブバージョン= 0.19.0を使用してAndroidを利用できませんでした。

何らかの理由で、スタイルシート内のresizeModeが適切に機能しませんでしたか?ただし、スタイルシートに

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、Imageを使用する必要があります。ここでコンテナーとして表示する必要はありません。ImageBackgroundだけをメインコンテナーとして使用できます。
Diego Unanue

13

ブレーデンロックウェルネイピア答えに基づいて、私はこの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

これを背景画像として使用する場合は、2017年6月末にv0.46 で導入された新しい<ImageBackground>コンポーネントを使用する必要があります。ネストはサポートされますが、すぐにはサポートされません。<Image>

コミットの概要は次のとおりです。

コンポーネント内でのビューのネストのサポートを削除します。この機能を使用するとサポートintrinsinc content size<Image>不可能になるため、これを行うことにしました 。そのため、移行プロセスが完了したら、画像サイズを明示的に指定する必要はありません。実際の画像ビットマップから推測できます。

そして、これがステップ#0です。

非常にシンプルなスタイリングを介してこの機能を実装する非常にシンプルなドロップイン置換です。中に入れたい場合はの代わりにご利用ください。


11

ImageBackgroundへの更新

<Image />コンテナとしての使用はしばらくの間推奨されていないため、すべての回答は実際には重要な何かを見逃しています。適切に使用するに<ImageBackground />style with およびimageStyle propを選択します。画像に関連するすべてのスタイルをに適用し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

Oh God最後に、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がどこからインポートされたかを確認したいだけですか?
Rudolph Opperman、2018年

わかりましたので、react-nativeからインポートしたImageBackgroundは設定できません。100%
Rudolph Opperman

Androidエミュレーターでは表示されるがデバイスでは表示されない問題に遭遇したことがありますか?
Rudolph Opperman、2018年

React NativeからImageBackgroundをインポートできます。'React-native 'から{ImageBackground}をインポートしてください。魔女のデバイスをテストしましたか?端末に問題はありませんでした。
Ali Esfandiari、2018年

私のエミュレーターはNexus 5仕様でした。そして私のアンドロイドはWileyfox Swiftでした。主な違いは解像度でしたので、画像で確認したところ、画像の解像度がお使いのデバイスよりも高い場合は表示されないようです。スタイルで画像を小さくしてみましたが、うまくいきませんでしたので、画像の解像度を低く変更しましたが、問題なく動作するようです。解像度が低くなることは実際には問題ではなく、ログイン画面であり、テキスト入力とボタンがいくつかあります。どうもありがとうございました。
ルドルフOpperman

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

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;

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(from: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

将来、Imageタグをネストできないと思われるため、BackgroundImageを使用する必要があると聞きました。しかし、BackgroudImageで背景を適切に表示できませんでした。私が行ったのは、ビュータグ内にイメージをネストし、外側のビューとイメージの両方のスタイルを設定することでした。キーは幅を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

antoine129で<ImageBackground>すでに述べたように使用します。使用して子供たちと一緒には廃止されます。<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>
        );
    }
}

コーディングをお楽しみください...

出力:

これは私のコードの出力です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.