在 React Native 中实现一个简单的灯箱(Lightbox)效果,并添加关闭动画,可以使用 Animated
API 来控制动画效果。以下是一个完整的示例,展示如何创建一个带有关闭动画的灯箱组件。
首先,确保您已经安装了 React Native 环境。如果还没有安装,可以参考 React Native 官方文档 进行安装。
创建一个新的文件 Lightbox.js
,并在其中编写灯箱组件的代码。
// Lightbox.js
import React, { useState, useRef } from 'react';
import { View, Modal, Text, TouchableOpacity, Animated, StyleSheet } from 'react-native';
const Lightbox = ({ visible, onClose }) => {
const [showModal, setShowModal] = useState(visible);
const opacity = useRef(new Animated.Value(0)).current;
React.useEffect(() => {
if (visible) {
setShowModal(true);
Animated.timing(opacity, {
toValue: 1,
duration: 300,
useNativeDriver: true,
}).start();
} else {
Animated.timing(opacity, {
toValue: 0,
duration: 300,
useNativeDriver: true,
}).start(() => setShowModal(false));
}
}, [visible]);
if (!showModal) return null;
return (
<Modal transparent={true} visible={showModal} animationType="none">
<Animated.View style={[styles.overlay, { opacity }]}>
<View style={styles.lightbox}>
<Text style={styles.text}>This is a Lightbox</Text>
<TouchableOpacity onPress={onClose} style={styles.button}>
<Text style={styles.buttonText}>Close</Text>
</TouchableOpacity>
</View>
</Animated.View>
</Modal>
);
};
const styles = StyleSheet.create({
overlay: {
flex: 1,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
justifyContent: 'center',
alignItems: 'center',
},
lightbox: {
width: 300,
padding: 20,
backgroundColor: 'white',
borderRadius: 10,
alignItems: 'center',
},
text: {
marginBottom: 20,
fontSize: 18,
},
button: {
padding: 10,
backgroundColor: '#007BFF',
borderRadius: 5,
},
buttonText: {
color: 'white',
fontSize: 16,
},
});
export default Lightbox;
在您的主应用文件(例如 App.js
)中使用 Lightbox
组件。
// App.js
import React, { useState } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import Lightbox from './Lightbox';
const App = () => {
const [lightboxVisible, setLightboxVisible] = useState(false);
return (
<View style={styles.container}>
<TouchableOpacity onPress={() => setLightboxVisible(true)} style={styles.openButton}>
<Text style={styles.buttonText}>Open Lightbox</Text>
</TouchableOpacity>
<Lightbox visible={lightboxVisible} onClose={() => setLightboxVisible(false)} />
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
openButton: {
padding: 10,
backgroundColor: '#007BFF',
borderRadius: 5,
},
buttonText: {
color: 'white',
fontSize: 16,
},
});
export default App;
Modal
组件来创建一个模态视图。Animated.View
来控制灯箱的透明度。useEffect
钩子来监听 visible
属性的变化,并启动相应的动画。visible
为 false
时,启动关闭动画,并在动画结束后隐藏模态视图。useState
钩子来管理灯箱的可见性状态。true
。visible
和 onClose
属性传递给 Lightbox
组件。领取专属 10元无门槛券
手把手带您无忧上云