react-native - 包含View的Fit Image,而不是整个屏幕大小

Bar*_*amo 22 javascript flexbox reactjs react-native

我正在尝试将图像放入其包含的视图中,以便我可以拥有无​​缝的图像网格.问题是,resizeMode='contain'似乎适合屏幕的宽度或至少一些更高级别的容器,我需要图像以适应每个列表项的大小.

这是样式和结果网格的一个非常丑陋的例子:

风格:

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'blue'
  },

  item: {
    flex: 1,
    overflow: 'hidden',
    alignItems: 'center',
    backgroundColor: 'orange',
    position: 'relative',
    margin: 10
  },

  image: {
    flex: 1
  }
})
Run Code Online (Sandbox Code Playgroud)

布局:

<TouchableOpacity 
  activeOpacity={ 0.75 }
  style={ styles.item }
>
  <Image
    style={ styles.image }
    resizeMode='contain'
    source={ temp }
  /> 
</TouchableOpacity>
Run Code Online (Sandbox Code Playgroud)

结果(带resizeMode='contain'):

在此输入图像描述

结果(带resizeMode='cover'):

在此输入图像描述

如您所见,covered图像非常大,并且与整个屏幕一样宽,并且不适合立即包含的视图.

更新1:

通过对图像应用缩放变换并将其从中心缩小,我能够获得接近我正在寻找的结果:

变换:

transform: [{ scale: 0.55 }]
Run Code Online (Sandbox Code Playgroud)

生成的布局(没有边距或填充): 在此输入图像描述

小智 27

将尺寸设置为视图,并确保将图像的高度和宽度设置为"未定义",如下例所示:

    <View style={{width: 10, height:10 }} >
      <Image style= {{flex:1 , width: undefined, height: undefined}}    
       source={require('../yourfolder/yourimage')}
        />
    </View>
Run Code Online (Sandbox Code Playgroud)

这将确保您的图像缩放并完美地适合您的视图.


saz*_*y4o 21

例如,如果您知道宽高比,则如果您的图像是方形的,则可以设置heightwidth来填充容器,并通过该aspectRatio属性 设置另一个

如果要height自动设置,请使用以下样式:

{
    width: '100%',
    height: undefined,
    aspectRatio: 1,
}
Run Code Online (Sandbox Code Playgroud)

注意:height必须undefined

  • 我必须添加 resizeMode: 'contain' 才能使其正常工作。如果不是默认的封面模式,则裁剪图像。 (15认同)
  • 这个答案有什么问题?它似乎为我工作。如果我需要修复某些问题,请发表评论 (2认同)

Suj*_*eet 12

只是您需要像这样传递 resizeMode 以适应包含视图中的图像

<Image style={styles.imageStyle} resizeMode={'cover'} source={item.image}/>

const style = StyleSheet.create({
  imageStyle: {
      alignSelf: 'center',
      height:'100%', 
      width:'100%'
    },]
})
Run Code Online (Sandbox Code Playgroud)


cmc*_*des 12

任何想要他的图像在没有任何裁剪的情况下全屏显示的人(在纵向和横向模式下),使用这个:

image: {
    flex: 1,
    width: '100%',
    height: '100%',
    resizeMode: 'contain',
},
Run Code Online (Sandbox Code Playgroud)


Nad*_*bit 7

我无法使用resizeMode属性来运行示例Image,但因为图像都是正方形,所以有一种方法可以使用窗口的尺寸和flexbox来完成.

设置flexDirection: 'row',flexWrap: 'wrap'然后,只要它们都是相同的尺寸,它们都会排列.

我把它设置在这里

https://snack.expo.io/HkbZNqjeZ

"use strict";

var React = require("react-native");
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Image,
  TouchableOpacity,
  Dimensions,
  ScrollView
} = React;

var deviceWidth = Dimensions.get("window").width;
var temp = "http://thumbs.dreamstime.com/z/close-up-angry-chihuahua-growling-2-years-old-15126199.jpg";
var SampleApp = React.createClass({
  render: function() {
    var images = [];

    for (var i = 0; i < 10; i++) {
      images.push(
        <TouchableOpacity key={i} activeOpacity={0.75} style={styles.item}>
          <Image style={styles.image} source={{ uri: temp }} />
        </TouchableOpacity>
      );
    }

    return (
      <ScrollView style={{ flex: 1 }}>
        <View style={styles.container}>
          {images}
        </View>
      </ScrollView>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)


Alj*_*aro 6

这对我有用,

<Image style={styles.imageStyle} resizeMode="cover" source={imageSource} />

const styles = StyleSheet.create({
  imageStyle: {
    width: undefined,
    height: '100%',
    aspectRatio: 1,
    alignSelf: 'center',
  },
});
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为这是因为您没有指定item.

如果您只想连续显示 2 张图像,您可以尝试这样的操作,而不是使用 flex:

item: {
    width: '50%',
    height: '100%',
    overflow: 'hidden',
    alignItems: 'center',
    backgroundColor: 'orange',
    position: 'relative',
    margin: 10,
},
Run Code Online (Sandbox Code Playgroud)

这对我有用,希望它有所帮助。