React Native CircularProgress动画触发时机与按钮释放事件捕获问题
实现SnapChat风格的录制进度动画(控制react-native-circular-progress启动时机)
我来帮你搞定这个需求!要实现按住图标启动录制+进度动画、松开停止的效果,我们可以通过状态控制和触摸事件结合来实现,下面是具体的步骤和代码示例:
核心思路
- 用状态控制动画启动时机:默认不触发动画,只有在用户按住图标后才启动进度动画。
- 利用触摸事件捕获开始/停止动作:用
onPressIn(按住时触发)启动录制和动画,onPressOut(松开时触发)停止录制并重置动画。 - 通过Animated.Value控制进度:用React Native的Animated API来驱动进度环的动画,模拟录制时长。
完整代码示例
import React, { useState, useRef } from 'react'; import { View, TouchableOpacity, Text } from 'react-native'; import { CircularProgress } from 'react-native-circular-progress'; const RecordButton = () => { // 标记是否正在录制 const [isRecording, setIsRecording] = useState(false); // 控制进度动画的Animated值,初始为0 const progressValue = useRef(new Animated.Value(0)).current; // 开始录制逻辑 const handleStartRecording = () => { setIsRecording(true); // 调用你的capture方法 capture(); // 启动进度动画:3秒内从0到1(可根据需求调整时长) Animated.timing(progressValue, { toValue: 1, duration: 3000, useNativeDriver: false, }).start(() => { // 动画自动结束后,触发停止录制 handleStopRecording(); }); }; // 停止录制逻辑 const handleStopRecording = () => { setIsRecording(false); // 立即停止动画并重置进度到0 progressValue.stopAnimation(); progressValue.setValue(0); // 这里添加停止录制的后续逻辑 console.log('停止录制'); }; // 你的capture方法,实现录制启动的具体逻辑 const capture = () => { console.log('开始录制视频'); // 比如启动相机录制、初始化录制相关资源等 }; return ( <View style={{ alignItems: 'center', justifyContent: 'center' }}> {/* 按住录制的按钮 */} <TouchableOpacity onPressIn={handleStartRecording} onPressOut={handleStopRecording} activeOpacity={0.8} style={{ width: 70, height: 70, borderRadius: 35, backgroundColor: '#ff3b30', alignItems: 'center', justifyContent: 'center', }} > <Text style={{ color: 'white', fontSize: 20 }}>🎥</Text> </TouchableOpacity> {/* 进度环:只有录制时才显示动画,默认显示空环 */} <CircularProgress size={90} width={6} fill={isRecording ? progressValue : 0} tintColor="#ff3b30" backgroundColor="#e0e0e0" style={{ position: 'absolute' }} /> </View> ); }; export default RecordButton;
关键细节说明
- 触摸事件的选择:用
onPressIn和onPressOut而不是onPress,因为onPress是点击抬起后才触发,而我们需要按住就启动,松开就停止,这两个事件刚好匹配SnapChat的交互逻辑。 - 动画控制:
progressValue.stopAnimation()会立即终止当前的动画,避免松开后动画还继续运行;setValue(0)则重置进度,确保下次录制能从0开始。 - 进度环的显示:如果不想隐藏进度环,默认可以显示一个空的灰色环,录制时再启动红色的进度动画,这样视觉上更连贯。
内容的提问来源于stack exchange,提问作者SwimmingG
相关产品推荐
相关产品推荐

