React Native - 添加边距:相机胶卷中的 1
React Native - Adding margin: 1 in Camera Roll
如何在我的相机胶卷中完美添加margin: 1
?因为当我在 <Image .../>
中添加 margin: 1
时,顺序将不正确。
我想要的结果就像Instagram里的一样。左边和右边没有边距吧?
就像这张图:
这是我的代码:
render() {
return(
<View style={styles.container}>
{/* <SelectedImage source={{uri: this.state.pickedImage}}/> */}
<Image source={{uri: this.state.pickedImage}} style={styles.image}/>
<ScrollView contentContainerStyle={styles.scrollView} showsVerticalScrollIndicator={false}>
{this.state.photos.map((photos, index) => {
return(
<TouchableHighlight
style={{opacity: index === this.state.index ? .5 : 1}}
onPress={() => this.setState({pickedImage: photos.node.image.uri})}
key={index}
underlayColor='transparent'
>
<Image
style={{width: width / 3, height: width /3}}
source={{uri: photos.node.image.uri}}
resizeMode='cover'
/>
</TouchableHighlight>
);
})}
</ScrollView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
height: '100%',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
},
scrollView: {
flexWrap: 'wrap',
flexDirection: 'row'
},
scrollViewContainer: {
flex: 1,
flexDirection: 'row',
},
image: {
width: '100%',
height: 300,
backgroundColor: 'black'
}
});
这是我自己的结果:(不要为黑边烦恼,我只是没有完美裁剪,我的 Android 模拟器中只有 6 张照片)。
建议的答案:
componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();
photoFilter = () => {
var arr = this.state.photos;
var number = 0;
arr.forEach((item) => {
switch(number) {
case 0:
number = 1;
item.position="left"
break;
case 1:
number = 2;
item.position="center"
break;
case 2:
number = 0;
item.position="right"
break;
default:
return null;
}
})
this.setState({photos: arr})
}
};
imageStylePositionCalc = (pos) =>{
if(pos==="left") return {marginRight:1,marginBottom:1}
if(pos==="center") return {marginRight:1,marginBottom:1}
if(pos==="right") return {marginBottom:1}
}
render() {
return(
<View style={styles.container}>
{/* <SelectedImage source={{uri: this.state.pickedImage}}/> */}
<Image source={{uri: this.state.pickedImage}} style={styles.image}/>
<ScrollView contentContainerStyle={styles.scrollView} showsVerticalScrollIndicator={false}>
{this.state.photos.map((photos, index) => {
return(
<TouchableHighlight
style={{opacity: index === this.state.index ? .5 : 1}}
onPress={() => this.setState({pickedImage: photos.node.image.uri})}
key={index}
underlayColor='transparent'
>
<Image
style={[{width: width / 3, height: width /3}, this.imageStylePositionCalc(photos.position)]}
source={{uri: photos.node.image.uri}}
resizeMode='cover'
/>
</TouchableHighlight>
);
})}
</ScrollView>
</View>
);
}
}
这是另一个问题,边距:1 占据了屏幕的整个宽度,第二行没有边距:
我有一个解决你的问题的方法,虽然不是最好的方法,因为我不确定如何去掉最大边缘和最下方边缘,但无论如何。
const styles = StyleSheet.create({
container: {
height: '100%',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
},
scrollView: {
flexWrap: 'wrap',
flexDirection: 'row',
justifyContent: 'space-between', // This one is new
marginHorizontal: -3 // This one is new
},
scrollViewContainer: {
flex: 1,
flexDirection: 'row'
},
image: {
width: '100%',
height: 300,
backgroundColor: 'black'
}
});
/* Rest of the code stays the same, only the image style gets changed to the follwoing */
<Image
style={{
width: width / 3,
height: width / 3,
margin: 1
}}
source={{ uri: photos.node.image.uri }}
resizeMode="cover"
/>
希望对您有所帮助。
在做地图之前,我建议遍历数组的每个部分并添加一个值,说明它是放在右边、左边还是中间。
类似于:
photoFilter=()=>{
var arr=this.state.photos;
var number=0;
arr.forEach((item)=>{
switch (number){
case 0:
number=1;
item.position="left"
break;
case 1:
number=2;
item.position="center"
break;
case 2:
number=0;
item.position="right"
break;
default:
return null
}
})
this.setState({photos:arr})
}
然后,渲染图像时:
<Image
style={[{width: width / 3, height: width /3},this.imageStylePositionCalc(item.position)]}
source={{ uri: photos.node.image.uri }}
resizeMode="cover"
/>
然后添加一个功能:
imageStylePositionCalc=(pos)=>{
if(pos==="left") return {marginRight:1,marginBottom:1}
if(pos==="center") return {marginRight:1,marginBottom:1}
if(pos==="right") return {marginBottom:1}
}
这可能不是最佳答案,但应该有效
更新:
问题是您在 didMount 中定义了 photoFilter 函数。
我说在 componentDidMount 中调用它的意思是:
componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();
this.photoFilter
}
photoFilter = () => {
var arr = this.state.photos;
var number = 0;
arr.forEach((item) => {
switch(number) {
case 0:
number = 1;
item.position="left"
break;
case 1:
number = 2;
item.position="center"
break;
case 2:
number = 0;
item.position="right"
break;
default:
return null;
}
})
this.setState({photos: arr})
}
如何在我的相机胶卷中完美添加margin: 1
?因为当我在 <Image .../>
中添加 margin: 1
时,顺序将不正确。
我想要的结果就像Instagram里的一样。左边和右边没有边距吧?
就像这张图:
这是我的代码:
render() {
return(
<View style={styles.container}>
{/* <SelectedImage source={{uri: this.state.pickedImage}}/> */}
<Image source={{uri: this.state.pickedImage}} style={styles.image}/>
<ScrollView contentContainerStyle={styles.scrollView} showsVerticalScrollIndicator={false}>
{this.state.photos.map((photos, index) => {
return(
<TouchableHighlight
style={{opacity: index === this.state.index ? .5 : 1}}
onPress={() => this.setState({pickedImage: photos.node.image.uri})}
key={index}
underlayColor='transparent'
>
<Image
style={{width: width / 3, height: width /3}}
source={{uri: photos.node.image.uri}}
resizeMode='cover'
/>
</TouchableHighlight>
);
})}
</ScrollView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
height: '100%',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
},
scrollView: {
flexWrap: 'wrap',
flexDirection: 'row'
},
scrollViewContainer: {
flex: 1,
flexDirection: 'row',
},
image: {
width: '100%',
height: 300,
backgroundColor: 'black'
}
});
这是我自己的结果:(不要为黑边烦恼,我只是没有完美裁剪,我的 Android 模拟器中只有 6 张照片)。
建议的答案:
componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();
photoFilter = () => {
var arr = this.state.photos;
var number = 0;
arr.forEach((item) => {
switch(number) {
case 0:
number = 1;
item.position="left"
break;
case 1:
number = 2;
item.position="center"
break;
case 2:
number = 0;
item.position="right"
break;
default:
return null;
}
})
this.setState({photos: arr})
}
};
imageStylePositionCalc = (pos) =>{
if(pos==="left") return {marginRight:1,marginBottom:1}
if(pos==="center") return {marginRight:1,marginBottom:1}
if(pos==="right") return {marginBottom:1}
}
render() {
return(
<View style={styles.container}>
{/* <SelectedImage source={{uri: this.state.pickedImage}}/> */}
<Image source={{uri: this.state.pickedImage}} style={styles.image}/>
<ScrollView contentContainerStyle={styles.scrollView} showsVerticalScrollIndicator={false}>
{this.state.photos.map((photos, index) => {
return(
<TouchableHighlight
style={{opacity: index === this.state.index ? .5 : 1}}
onPress={() => this.setState({pickedImage: photos.node.image.uri})}
key={index}
underlayColor='transparent'
>
<Image
style={[{width: width / 3, height: width /3}, this.imageStylePositionCalc(photos.position)]}
source={{uri: photos.node.image.uri}}
resizeMode='cover'
/>
</TouchableHighlight>
);
})}
</ScrollView>
</View>
);
}
}
这是另一个问题,边距:1 占据了屏幕的整个宽度,第二行没有边距:
我有一个解决你的问题的方法,虽然不是最好的方法,因为我不确定如何去掉最大边缘和最下方边缘,但无论如何。
const styles = StyleSheet.create({
container: {
height: '100%',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
},
scrollView: {
flexWrap: 'wrap',
flexDirection: 'row',
justifyContent: 'space-between', // This one is new
marginHorizontal: -3 // This one is new
},
scrollViewContainer: {
flex: 1,
flexDirection: 'row'
},
image: {
width: '100%',
height: 300,
backgroundColor: 'black'
}
});
/* Rest of the code stays the same, only the image style gets changed to the follwoing */
<Image
style={{
width: width / 3,
height: width / 3,
margin: 1
}}
source={{ uri: photos.node.image.uri }}
resizeMode="cover"
/>
希望对您有所帮助。
在做地图之前,我建议遍历数组的每个部分并添加一个值,说明它是放在右边、左边还是中间。 类似于:
photoFilter=()=>{
var arr=this.state.photos;
var number=0;
arr.forEach((item)=>{
switch (number){
case 0:
number=1;
item.position="left"
break;
case 1:
number=2;
item.position="center"
break;
case 2:
number=0;
item.position="right"
break;
default:
return null
}
})
this.setState({photos:arr})
}
然后,渲染图像时:
<Image
style={[{width: width / 3, height: width /3},this.imageStylePositionCalc(item.position)]}
source={{ uri: photos.node.image.uri }}
resizeMode="cover"
/>
然后添加一个功能:
imageStylePositionCalc=(pos)=>{
if(pos==="left") return {marginRight:1,marginBottom:1}
if(pos==="center") return {marginRight:1,marginBottom:1}
if(pos==="right") return {marginBottom:1}
}
这可能不是最佳答案,但应该有效
更新: 问题是您在 didMount 中定义了 photoFilter 函数。
我说在 componentDidMount 中调用它的意思是:
componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();
this.photoFilter
}
photoFilter = () => {
var arr = this.state.photos;
var number = 0;
arr.forEach((item) => {
switch(number) {
case 0:
number = 1;
item.position="left"
break;
case 1:
number = 2;
item.position="center"
break;
case 2:
number = 0;
item.position="right"
break;
default:
return null;
}
})
this.setState({photos: arr})
}