react-native-reanimated用法清单

2025年5月29日 Mr 焦 447

以下是 react-native-reanimated 的用法清单和核心文档说明,涵盖主要功能、API 和使用示例:


一、核心概念

  1. 工作线程:动画在 UI 线程执行(非 JS 线程),避免卡顿
  2. 共享值(Shared Values):动画的驱动数据(代替 Animated.Value
  3. 动画修饰器:定义动画行为(如 withTiming, withSpring
  4. 手势集成:与 react-native-gesture-handler 深度结合

二、安装

# 安装依赖
npm install react-native-reanimated

# 或使用 Expo
expo install react-native-reanimated

babel.config.js 中添加插件:

plugins: ['react-native-reanimated/plugin']

三、核心 API 清单

1. 动画值

API 描述 示例
useSharedValue 创建动画驱动值 const width = useSharedValue(100)
useDerivedValue 派生值(依赖其他共享值) const ratio = useDerivedValue(() => width.value / 2)
useAnimatedReaction 响应共享值变化 useAnimatedReaction(() => count.value, (val) => { /* ... */ })

2. 动画样式

API 描述 示例
useAnimatedStyle 生成动态样式 示例
useAnimatedProps 生成动态属性(用于非样式组件) 示例

3. 动画函数

函数 描述 适用场景
withTiming 平滑过渡动画 大小、透明度变化
withSpring 弹簧物理动画 弹性效果
withDelay 延迟执行 序列动画
withRepeat 循环动画 呼吸效果
withSequence 顺序执行多个动画 复杂动画序列
withDecay 衰减动画(如滑动惯性) 列表滑动

4. 手势处理

API 描述 示例
GestureDetector 手势容器组件 示例
useAnimatedGestureHandler 手势事件处理(旧版) 兼容旧项目

5. 布局动画

API 描述
Layout 自动布局动画(Reanimated v3+)
Entering/Exiting 进入/退出动画
FadeIn/FadeOut 内置淡入淡出效果

四、关键用法示例

示例1: 基础动画(缩放+透明度)

import Animated, { 
  useSharedValue, 
  useAnimatedStyle, 
  withTiming 
} from 'react-native-reanimated';

const ScaleBox = () => {
  const scale = useSharedValue(1);
  const opacity = useSharedValue(1);

  const animatedStyle = useAnimatedStyle(() => ({
    transform: [{ scale: scale.value }],
    opacity: opacity.value
  }));

  const onPress = () => {
    scale.value = withTiming(0.8, { duration: 300 });
    opacity.value = withTiming(0.5, { duration: 300 });
  };

  return (
    <Animated.View style={[styles.box, animatedStyle]}>
      <Button title="Animate" onPress={onPress} />
    </Animated.View>
  );
};

示例2: 手势拖拽

import { GestureDetector, Gesture } from 'react-native-gesture-handler';
import Animated, { useSharedValue, useAnimatedStyle } from 'react-native-reanimated';

const Draggable = () => {
  const translateX = useSharedValue(0);
  const translateY = useSharedValue(0);

  const panGesture = Gesture.Pan()
    .onChange((e) => {
      translateX.value += e.changeX;
      translateY.value += e.changeY;
    });

  const animatedStyle = useAnimatedStyle(() => ({
    transform: [
      { translateX: translateX.value },
      { translateY: translateY.value }
    ]
  }));

  return (
    <GestureDetector gesture={panGesture}>
      <Animated.View style={[styles.draggable, animatedStyle]} />
    </GestureDetector>
  );
};

示例3: 关键帧动画

import { Keyframe } from 'react-native-reanimated';

const keyframe = new Keyframe({
  0: {
    transform: [{ rotate: '0deg' }],
    opacity: 0
  },
  30: {
    opacity: 0.3
  },
  100: {
    transform: [{ rotate: '360deg' }],
    opacity: 1
  }
});

// 使用
rotation.value = keyframe;

五、布局动画示例

import Animated, { Layout } from 'react-native-reanimated';

const ListItem = ({ text }) => (
  <Animated.View 
    layout={Layout.springify()} // 自动添加布局动画
    style={styles.item}
  >
    <Text>{text}</Text>
  </Animated.View>
);

// 进入/退出动画
<Animated.View 
  entering={FadeIn.duration(500)} 
  exiting={FadeOut}
/>

六、性能优化技巧

  1. 减少 JS 线程通信
    • 使用 runOnJS 在 UI 线程执行简单逻辑
      useAnimatedReaction(
      () => scroll.value,
      (scroll) => runOnJS(updateBackend)(scroll)
      );
  2. 避免频繁更新:用 useDerivedValue 代替多个独立值
  3. 简化样式:合并 useAnimatedStyle 调用

七、调试工具

import { enableLayoutAnimations } from 'react-native-reanimated';

// 开发时启用布局动画
enableLayoutAnimations(true);

// 日志调试
import { log } from 'react-native-reanimated';
useDerivedValue(() => log('Value:', sharedValue.value));

八、官方资源

注意:Reanimated 3.x+ 要求 React Native ≥ 0.64,推荐使用函数式组件和 Hooks 写法。

分类:
标签:
版权属于Mr 焦
本文链接:https://www.mtsws.cn/post-8.html
评论
暂无评论数据
相关推荐
js 基础语法
ECMAScript 源码文本会被从左到右扫描,并被转换为一系列的输入元素,包括标识符、控制符、行终止符、注释和空白符。 同样地,ECMAScript 也定义了一些关键字、字面量以及行尾分号补全的规则。 字符集 JavaScript 程序使用 Unicode 字符集编写。Unicode 是 ASCII 和 Latin-1 的超集,并支持地球上几乎所有在使用的...
Mr 焦 3532025年5月27日 js
Linux 系统-基本概要
基本概要 抽象级别和层次 最底层是硬件系统,包括内存和中央处理器(用于计算和从内存中读写数据),此外硬盘和网络接口也是硬件系统的一部分。 硬件系统之上是 内核,它是操作系统的核心。内核是运行在内存中的软件,它向中央处理器发送指令。内核管理硬件系统,是硬件系统和应用程序之间进行通信的接口。 进程 是指计算机中运行的所有程序,由内核统一管理,它们组成了最顶层,称...
Mr 焦 2342025年5月30日 Linux
Node.js中Joi的详细用法
Joi 在 Node.js 中的详细用法 Joi 是一个强大的 JavaScript 对象模式验证库,常用于 Node.js 应用中验证和转换数据。下面详细介绍 Joi 的用法。 安装 npm install joi 基本用法 1. 基本验证 const Joi = require( joi ); // 定义 schema const schema = Jo...
Mr 焦 3302025年6月8日
React概述
一、React概述 1.1、前端三大主流框架 Angular.js:出来较早的前端框架,学习曲线比较陡,NG1学起来比较麻烦,NG2 ~ NG5开始,进行了一系列的改革,也提供了组件化开发的概念;从NG2开始,也支持使用TS(TypeScript)进行编程; Vue.js:最火(关注的人比较多)的一门前端框架,它是中国人开发的,对我我们来说,文档要友好一些;...
Mr 焦 2502025年5月27日 react
react native 语音转文字
在 React Native 中实现语音转文字(Speech-to-Text)功能,可以通过以下几种方式来实现。以下是详细的实现步骤和说明: 1. 使用 React Native 社区库 React Native 社区提供了许多开源库来处理语音识别功能,其中最常用的是 react-native-voice 和 @react-native-community/...
Mr 焦 2582025年5月30日 react native