React-native,如何根据图像的原始大小调整图像的大小?
React-native, how to resize the image based on the original size of image?
我有要显示的图像列表,其中图像的大小是未知的,我怎样才能完全显示图像而不在图像的顶部和底部有任何透明空间? (我尝试从 getSize 方法获取图像大小,最终在顶部和底部给出很多空间)我希望图像调整大小并适合这样,
但是,如果我将调整大小模式设置为包含,我会得到空白,如果我将调整大小模式设置为拉伸,小图像的大小将失去其质量
如何调整图像大小以去除空白并使其适合自己
import React, { Component } from "react";
import { Dimensions, Image } from "react-native";
const { width, height } = Dimensions.get("window");
export default class ResizedImage extends Component {
constructor(props) {
super(props);
this.state = {
height: 0
};
}
componentDidMount() {
Image.getSize(
this.props.source.uri,
(srcWidth, srcHeight) => {
const ratio = Math.min(width / srcWidth, height / srcHeight);
this.setState({ height: srcHeight * ratio });
},
error => console.log(error)
);
}
componentWillUnmount() {
this.setState({ height: 0 });
}
render() {
const { source} = this.props;
return (
<Image
source={{ uri: source.uri }}
style={{
width: width * 0.9,
height: this.state.height
}}
resizeMode={"cover"}
/>
);
}
}
您可以将其用作组件并将 URI 作为道具传递,一切都已完成。
这是我为解决该问题而编写的图像组件。
它适用于 Image 和 ImageBackground(带子项)。
import React, {Component} from 'react';
import resolveAssetSource from 'resolveAssetSource';
import {
Image,
ImageBackground,
View,
} from 'react-native';
export default class ScalableImageComponent extends Component {
constructor(props) {
super(props);
}
render() {
const source = resolveAssetSource(this.props.source);
if (source == null) {
return null;
}
const aspectRatio = source.width / source.height;
const fixedWidth = this.props.width;
const fixedHeight = this.props.height;
const widthCalculated = fixedWidth != null ? fixedWidth : fixedHeight * aspectRatio;
const heightCalculated = fixedHeight != null ? fixedHeight : fixedWidth / aspectRatio;
if (this.props.isBackgroundImage) {
return (
<ImageBackground
source={this.props.source}
style={[
this.props.style,
{
width: widthCalculated,
height: heightCalculated,
}
]}
>
{this.props.children}
</ImageBackground>
);
} else {
return (
<Image
source={this.props.source}
style={[
this.props.style,
{
width: widthCalculated,
height: heightCalculated,
}
]}
/>
);
}
}
}
像使用普通图片一样使用它。
如果您希望它成为图像背景,只需传递一个道具 isBackgroundImage={true}
例如:
<ScalableImageComponent
isBackgroundImage={true}
source={require('./static.png')}
>
<Text>text over image</Text>
</ScalableImageComponent>
我有要显示的图像列表,其中图像的大小是未知的,我怎样才能完全显示图像而不在图像的顶部和底部有任何透明空间? (我尝试从 getSize 方法获取图像大小,最终在顶部和底部给出很多空间)我希望图像调整大小并适合这样,
但是,如果我将调整大小模式设置为包含,我会得到空白,如果我将调整大小模式设置为拉伸,小图像的大小将失去其质量
如何调整图像大小以去除空白并使其适合自己
import React, { Component } from "react";
import { Dimensions, Image } from "react-native";
const { width, height } = Dimensions.get("window");
export default class ResizedImage extends Component {
constructor(props) {
super(props);
this.state = {
height: 0
};
}
componentDidMount() {
Image.getSize(
this.props.source.uri,
(srcWidth, srcHeight) => {
const ratio = Math.min(width / srcWidth, height / srcHeight);
this.setState({ height: srcHeight * ratio });
},
error => console.log(error)
);
}
componentWillUnmount() {
this.setState({ height: 0 });
}
render() {
const { source} = this.props;
return (
<Image
source={{ uri: source.uri }}
style={{
width: width * 0.9,
height: this.state.height
}}
resizeMode={"cover"}
/>
);
}
}
您可以将其用作组件并将 URI 作为道具传递,一切都已完成。
这是我为解决该问题而编写的图像组件。 它适用于 Image 和 ImageBackground(带子项)。
import React, {Component} from 'react';
import resolveAssetSource from 'resolveAssetSource';
import {
Image,
ImageBackground,
View,
} from 'react-native';
export default class ScalableImageComponent extends Component {
constructor(props) {
super(props);
}
render() {
const source = resolveAssetSource(this.props.source);
if (source == null) {
return null;
}
const aspectRatio = source.width / source.height;
const fixedWidth = this.props.width;
const fixedHeight = this.props.height;
const widthCalculated = fixedWidth != null ? fixedWidth : fixedHeight * aspectRatio;
const heightCalculated = fixedHeight != null ? fixedHeight : fixedWidth / aspectRatio;
if (this.props.isBackgroundImage) {
return (
<ImageBackground
source={this.props.source}
style={[
this.props.style,
{
width: widthCalculated,
height: heightCalculated,
}
]}
>
{this.props.children}
</ImageBackground>
);
} else {
return (
<Image
source={this.props.source}
style={[
this.props.style,
{
width: widthCalculated,
height: heightCalculated,
}
]}
/>
);
}
}
}
像使用普通图片一样使用它。 如果您希望它成为图像背景,只需传递一个道具 isBackgroundImage={true} 例如:
<ScalableImageComponent
isBackgroundImage={true}
source={require('./static.png')}
>
<Text>text over image</Text>
</ScalableImageComponent>