React Native 中的透明覆盖
Transparent overlay in React Native
我正在尝试让一个透明的覆盖层在应用程序中向下滑动,就像这里这样 (all/filter-by):
到目前为止,我找到了 react-native-slider 和 react-native-overlay。我将滑块修改为从上到下工作,但它也总是向下移动 ListView。如果使用react-native-overlay,覆盖是静态的,我不能移动它。
我添加了一些来自原始 react-native 教程的演示代码 in this gist。单击按钮时,内容应保持不变,菜单应叠加。透明度现在不是那么重要,但会很棒。
最明智的解决方案是什么?
让你的ListView不往下移动的关键,就是把overlay的定位设置为absolute
。通过这样做,您可以手动设置视图的位置和 width/height 并且它不再遵循 flexbox 布局。查看以下简短示例。叠加层的高度固定为 360,但您可以轻松地对其进行动画处理或使其动态化。
'use strict';
var React = require('react-native');
var Dimensions = require('Dimensions');
// We can use this to make the overlay fill the entire width
var { width, height } = Dimensions.get('window');
var {
AppRegistry,
StyleSheet,
Text,
View,
} = React;
var SampleApp = React.createClass({
render: function() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to the React Native Playground!
</Text>
<View style={[styles.overlay, { height: 360}]} />
</View>
);
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
// Flex to fill, position absolute,
// Fixed left/top, and the width set to the window width
overlay: {
flex: 1,
position: 'absolute',
left: 0,
top: 0,
opacity: 0.5,
backgroundColor: 'black',
width: width
}
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);
module.exports = SampleApp;
import React, { Component } from 'react';
import { Image, StyleSheet, View } from 'react-native';
export default class App extends Component {
render() {
return (
<Image source={{uri: 'http://i.imgur.com/IGlBYaC.jpg'}} style={s.backgroundImage}>
<View style={s.overlay}/>
</Image>
);
}
}
const s = StyleSheet.create({
backgroundImage: {
flex: 1,
width: null,
height: null,
},
overlay: {
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
backgroundColor: 'red',
opacity: 0.3
}
});
最聪明的方法??
对我来说最聪明的方法是使用 react-native 中的模态框来构建高度可定制的响应式体验,您可以轻松设置模态框的运动方向、设置透明度、切换可见性等等,我个人从来没有使用现有的 npm 模块来实现侧边抽屉或导航栏,
我使用模态来做到这一点。
如果您愿意,我可以提供一个使用模态
实现导航抽屉的示例代码片段
也许最好使用 ImageBackground
-Component。
import {View, ImageBackground, Text} from 'react-native';
const styles = StyleSheet.create({
});
...
<ImageBackground
style={styles.image}
source={{uri: props.picture_url}}
>
<View style={styles.textbox}>
<Text style={styles.title} >CHILD OF IMAGE_BACKGROUND</Text >
</View>
</ImageBackground >
...
您可以使用此示例进行创建 overlay.You 可以更改覆盖的可见状态和不可见状态。
import React, { Component } from "react";
import { View, Text, StyleSheet } from "react-native";
class Popup extends Component {
constructor(props) {
super(props);
this.state = {
isPopupTrue: true
};
}
render() {
return (
<View style={styles.container}>
{ this.state.isPopupTrue &&
(<View style={styles.overlay}>
<View style={styles.popup}>
<Text style={styles.text}> Overlay </Text>
</View>
</View>)
}
</View>
);
}
}
export const styles = StyleSheet.create({
container: {
flex:1,
backgroundColor: "#c0d6e4"
},
overlay: {
position: "absolute",
top: 0,
right: 0,
bottom: 0,
left: 0,
justifyContent: "center",
alignItems: "center",
backgroundColor: "gray",
opacity: 0.9,
},
text: {
width: "20%",
fontSize: 15,
color: "black",
fontWeight: "bold"
},
});
我用这种方法遇到了同样的问题。
import {View,StyleSheet} from "react-native";
//where you want it to render
<View style={styles.overlaycontainer}>
<Text style={{color:"#fff"}}>Locating directions please wait ...</Text>
</View>
// at the bottom of your in styles
const styles = StyleSheet.create({
overlaycontainer:{
...StyleSheet.absoluteFillObject,
backgroundColor: '#000',
opacity:0.8,
justifyContent:"center",
alignItems:"center"
}
});
我正在尝试让一个透明的覆盖层在应用程序中向下滑动,就像这里这样 (all/filter-by):
到目前为止,我找到了 react-native-slider 和 react-native-overlay。我将滑块修改为从上到下工作,但它也总是向下移动 ListView。如果使用react-native-overlay,覆盖是静态的,我不能移动它。
我添加了一些来自原始 react-native 教程的演示代码 in this gist。单击按钮时,内容应保持不变,菜单应叠加。透明度现在不是那么重要,但会很棒。
最明智的解决方案是什么?
让你的ListView不往下移动的关键,就是把overlay的定位设置为absolute
。通过这样做,您可以手动设置视图的位置和 width/height 并且它不再遵循 flexbox 布局。查看以下简短示例。叠加层的高度固定为 360,但您可以轻松地对其进行动画处理或使其动态化。
'use strict';
var React = require('react-native');
var Dimensions = require('Dimensions');
// We can use this to make the overlay fill the entire width
var { width, height } = Dimensions.get('window');
var {
AppRegistry,
StyleSheet,
Text,
View,
} = React;
var SampleApp = React.createClass({
render: function() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to the React Native Playground!
</Text>
<View style={[styles.overlay, { height: 360}]} />
</View>
);
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
// Flex to fill, position absolute,
// Fixed left/top, and the width set to the window width
overlay: {
flex: 1,
position: 'absolute',
left: 0,
top: 0,
opacity: 0.5,
backgroundColor: 'black',
width: width
}
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);
module.exports = SampleApp;
import React, { Component } from 'react';
import { Image, StyleSheet, View } from 'react-native';
export default class App extends Component {
render() {
return (
<Image source={{uri: 'http://i.imgur.com/IGlBYaC.jpg'}} style={s.backgroundImage}>
<View style={s.overlay}/>
</Image>
);
}
}
const s = StyleSheet.create({
backgroundImage: {
flex: 1,
width: null,
height: null,
},
overlay: {
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
backgroundColor: 'red',
opacity: 0.3
}
});
最聪明的方法??
对我来说最聪明的方法是使用 react-native 中的模态框来构建高度可定制的响应式体验,您可以轻松设置模态框的运动方向、设置透明度、切换可见性等等,我个人从来没有使用现有的 npm 模块来实现侧边抽屉或导航栏,
我使用模态来做到这一点。
如果您愿意,我可以提供一个使用模态
也许最好使用 ImageBackground
-Component。
import {View, ImageBackground, Text} from 'react-native';
const styles = StyleSheet.create({
});
...
<ImageBackground
style={styles.image}
source={{uri: props.picture_url}}
>
<View style={styles.textbox}>
<Text style={styles.title} >CHILD OF IMAGE_BACKGROUND</Text >
</View>
</ImageBackground >
...
您可以使用此示例进行创建 overlay.You 可以更改覆盖的可见状态和不可见状态。
import React, { Component } from "react";
import { View, Text, StyleSheet } from "react-native";
class Popup extends Component {
constructor(props) {
super(props);
this.state = {
isPopupTrue: true
};
}
render() {
return (
<View style={styles.container}>
{ this.state.isPopupTrue &&
(<View style={styles.overlay}>
<View style={styles.popup}>
<Text style={styles.text}> Overlay </Text>
</View>
</View>)
}
</View>
);
}
}
export const styles = StyleSheet.create({
container: {
flex:1,
backgroundColor: "#c0d6e4"
},
overlay: {
position: "absolute",
top: 0,
right: 0,
bottom: 0,
left: 0,
justifyContent: "center",
alignItems: "center",
backgroundColor: "gray",
opacity: 0.9,
},
text: {
width: "20%",
fontSize: 15,
color: "black",
fontWeight: "bold"
},
});
我用这种方法遇到了同样的问题。
import {View,StyleSheet} from "react-native";
//where you want it to render
<View style={styles.overlaycontainer}>
<Text style={{color:"#fff"}}>Locating directions please wait ...</Text>
</View>
// at the bottom of your in styles
const styles = StyleSheet.create({
overlaycontainer:{
...StyleSheet.absoluteFillObject,
backgroundColor: '#000',
opacity:0.8,
justifyContent:"center",
alignItems:"center"
}
});