You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native CircularProgress动画触发时机与按钮释放事件捕获问题

实现SnapChat风格的录制进度动画(控制react-native-circular-progress启动时机)

我来帮你搞定这个需求!要实现按住图标启动录制+进度动画、松开停止的效果,我们可以通过状态控制和触摸事件结合来实现,下面是具体的步骤和代码示例:

核心思路

  1. 用状态控制动画启动时机:默认不触发动画,只有在用户按住图标后才启动进度动画。
  2. 利用触摸事件捕获开始/停止动作:用onPressIn(按住时触发)启动录制和动画,onPressOut(松开时触发)停止录制并重置动画。
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:55:04