React Native -如何使图像宽度100%和垂直顶部?

e0uiprwp  于 2023-06-06  发布在  React
关注(0)|答案(7)|浏览(397)

我是react-native的新手。我想做的是,适合设备的图像,并保持图像的比例。简单地我想做width : 100%
我搜索了如何使它,似乎resizeMode = 'contain'是好的。
然而,由于我使用了resizeMode = 'contain',图像保持垂直居中的位置,这是我不希望的。我希望它是垂直的顶部。
我尝试使用一个插件,如react-native-fit-image,但没有运气。
我找到了图像不能自动调整大小的原因。但我还是不知道怎么做。
所以,我的问题是,什么是处理这种情况的最佳方法?
我必须手动把width, height大小每个图像?
我想要:

  • 保持图像的比例。
  • 垂直顶部定位。

React原生测试代码:
https://snack.expo.io/ry3_W53rW
最后我想做的是:
https://jsfiddle.net/hadeath03/mb43awLr/
谢谢

i5desfxk

i5desfxk1#

图像垂直居中,因为您向style属性添加了flex: 1。不添加flex:1,因为这将填充图像到其父图像,这在本例中是不希望的。
你应该总是在React Native中为图像添加高度和宽度。如果图像总是相同的,您可以使用Dimensions.get('window').width来计算图像的大小。例如,如果比率始终为16 x9,则高度为图像宽度的9/16。宽度等于设备宽度,因此:

const dimensions = Dimensions.get('window');
const imageHeight = Math.round(dimensions.width * 9 / 16);
const imageWidth = dimensions.width;

return (
   <Image
     style={{ height: imageHeight, width: imageWidth }}
   />
);

注意:当使用这样的实现时,当旋转设备,使用分屏等时,您的图像不会自动调整大小。如果你支持多个方向,你也必须照顾好这些动作……

如果比率不相同,则通过每个不同图像的比率动态更改9 / 16。如果你真的不介意图像被裁剪了一点,你也可以使用固定高度的封面模式:(https://snack.expo.io/rk_NRnhHb

<Image
  resizeMode={'cover'}
  style={{ width: '100%', height: 200 }}
  source={{uri: temp}}
/>
ca1c2owp

ca1c2owp2#

只是想给予这个
您还可以等待ImageonLayout回调函数获取其布局属性并使用它来更新尺寸。我为此创建了一个组件:

import * as React from 'react';
import { Dimensions, Image, ImageProperties, LayoutChangeEvent, StyleSheet, ViewStyle } from 'react-native';

export interface FullWidthImageState {
  width: number;
  height: number;
  stretched: boolean;
}

export default class FullWidthImage extends React.Component<ImageProperties, FullWidthImageState> {
  constructor(props: ImageProperties) {
    super(props);

    this.state = { width: 100, height: 100, stretched: false };
  }

  render() {
    return <Image {...this.props} style={this.getStyle()} onLayout={this.resizeImage} />;
  }

  private resizeImage = (event: LayoutChangeEvent) => {
    if (!this.state.stretched) {
      const width = Dimensions.get('window').width;
      const height = width * event.nativeEvent.layout.height / event.nativeEvent.layout.width;
      this.setState({ width, height, stretched: true });
    }
  };

  private getStyle = (): ViewStyle => {
    const style = [StyleSheet.flatten(this.props.style)];
    style.push({ width: this.state.width, height: this.state.height });
    return StyleSheet.flatten(style);
  };
}

这将更新图像的尺寸以匹配屏幕的宽度。

stszievb

stszievb3#

您可以将此样式应用于图像:如果将Image应用于Image标签,则Image宽度为完整图像。

const win = Dimensions.get('window');
export default function App() {
  
  return (
    <View style={styles.container}>

       <Image
       style={{
        width: win.width/1,
        height: win.width/5,
        resizeMode: "contain",
        alignSelf: "center",
        borderRadius: 20,
      }}
        source={require('./assets/logo.png')}
      />

    </View>
  );
}
q35jwt9p

q35jwt9p4#

您可以将此样式应用于图像:如果将imageStyle应用于Image标签,则Image width将为100%,Image height将为300。

imageStyle:{
height:300,
flex:1,
width:null
}

假设您的图像代码是:

<Image style={imageStyle} source={{uri:'uri of the Image'}} />
e5nszbig

e5nszbig5#

右键点击你的图像以获得分辨率。在我的情况下 1233x882 

const { width } = Dimensions.get('window');

const ratio = 882 / 1233;

    const style = {
      width,
      height: width * ratio
    }

<Image source={image} style={style} resizeMode="contain" />

就这些

gudnpqoy

gudnpqoy6#

我有一个组件,它可以获取图像 prop 并进行适当的调整(并且可以在ScrollViewrequire d资产中工作)。在滚动视图中,它使用图像的高度作为高度,而不管它是否被缩放,这会导致一些多余的填充。此组件执行大小计算并重新调整图像样式,使其使用100%宽度,同时保持加载文件的纵横比。

import React, { useState } from "react";
import { Image, ImageProps } from "react-native";

export function FullWidthImage(props: ImageProps) {
  // Initially set the width to 100%
  const [viewDimensions, setViewDimensions] = useState<{
    width?: number | string;
    height?: number | string;
  }>({
    width: "100%",
    height: undefined,
  });

  const [imageDimensions, setImageDimensions] = useState<{
    width?: number;
    height?: number;
  }>(() => {
    if (typeof props.source === "number") {
      // handle case where the source is an asset in which case onLoad won't get triggered
      const { width, height } = Image.resolveAssetSource(props.source);
      return { width, height };
    } else {
      return {
        width: undefined,
        height: undefined,
      };
    }
  });
  return (
    <Image
      onLayout={(e) => {
        // this is triggered when the "view" layout is provided
        if (imageDimensions.width && imageDimensions.height) {
          setViewDimensions({
            width: e.nativeEvent.layout.width,
            height:
              (e.nativeEvent.layout.width * imageDimensions.height) /
              imageDimensions.width,
          });
        }
      }}
      onLoad={(e) => {
        // this is triggered when the image is loaded and we have actual dimensions.
        // But only if loading via URI
        setImageDimensions({
          width: e.nativeEvent.source.width,
          height: e.nativeEvent.source.height,
        });
      }}
      {...props}
      style={[
        props.style,
        {
          width: viewDimensions.width,
          height: viewDimensions.height,
        },
      ]}
    />
  );
}

这是为了补偿contain,即使图像宽度为100%,它也会在图像周围添加额外的填充(这基本上会使图像视图高度变满)。
请注意,您可能试图将其作为背景,在这种情况下,ImageBackground无法在Android上正确呈现。使用上面的代码,我做了一些调整,创建了下面的代码,它可以正确地呈现长文本和短文本。

import React, { PropsWithChildren } from "react";
import { ImageProps, View } from "react-native";
import { FullWidthImage } from "./FullWidthImage";

export function FullWidthImageBackground(props: PropsWithChildren<ImageProps>) {
  const imageProps = { ...props };
  delete imageProps.children;
  return (
    <View>
      <FullWidthImage
        {...imageProps}
        style={{
          position: "absolute",
        }}
      />
      {props.children}
    </View>
  );
}

注意如果你是和头一起使用它,你需要添加一个padding视图作为第一个子视图

<View
  style={{
    height: safeAreaInsets.top + (Platform.OS === "ios" ? 96 : 44),
  }}
/>
f8rj6qna

f8rj6qna7#

一个简单的方法是不定义图像的高度,并将宽度设置为100%。但是,有必要将resizeMode设置为contain。参见以下示例:

<View>
  <Image source={require('../../../assets/stools/type1.png')} resizeMode="contain"  style={{width: '100%'}}/>
</View>

这样,保留了纵横比。

要删除图像上方和下方的额外空间,您可以设置height: 100或任何其他数字。这不会影响纵横比`

相关问题