美文网首页
react-native-reanimated系列(一)

react-native-reanimated系列(一)

作者: 十豆三撇 | 来源:发表于2021-03-23 16:27 被阅读0次

关于

官方文档
github
Reanimated是一个React Native库,允许创建运行在UI线程上的流畅动画和交互。

动机

在React Native中,默认情况下所有的更新都会延迟至少一帧,因为UI和JS线程之间的通信是异步的。Reanimated的目标是提供将动画和事件处理逻辑从JS线程转移到UI线程的方法。通过定义Reanimated worklets来实现。worklets是可以被移动到一个单独的JavaScript虚拟机并在UI线程上同步执行的一小段JavaScript代码。这使得它能够立即响应触摸事件,并在事件发生时同一帧内更新UI。

版本差异

  • 交互和动画不再使用非直观的声明式API编写,可以用纯JS编写,以所谓的“worklets”的形式。
  • Shared Values不仅可以携带基本数据类型,还可以携带数组、对象和函数。
  • Shared Values不再直接关联到视图props,而是暴露一个useAnimatedStyle钩子,它返回一个可以作为视图样式参数来传递的样式对象。useAnimatedStyle钩子接受一个worklet,当它执行时,应该返回将被应用到关联视图的样式。样式worklet将在该worklet所使用的Shared Values发生变化时更新(库会自动检测对Shared Values的依赖)。
  • 动画可以通过两种方式启动,在Shared Values发生变化时触发动画,或者从useAnimatedStyle钩子返回动画值。
  • 事件worklet最常见的情况是修改一些Shared Values。因此,对这些值所做的修改将反映在被触发的动画样式worklet中,这反过来又会导致一些视图属性被更新。为了方便,Reanimated提供了一个事件钩子,专门与手势处理程序库一起工作,并允许你定义一个单独的worklet来处理不同的事件状态(例如,onStart,onActive等)。

问题和限制

  • Android端,目前只支持Hermes JS VM
  • 不支持远程调试,因为该库使用JSI来同步本地方法访问。可以使用Flipper来调试JS代码,然而目前不支持将调试器连接到运行在UI线程上的JS上下文。
  • 从React Native传递给worklets的对象在JavaScript中没有正确的prototype。因此这样的对象不可枚举,也就是说,你不能使用for in遍历,扩展操作符(...)或像Object.assign这样的函数来处理对象。
  • 使用Reanimated,你不能动画绘制布局的虚拟组件。例如,你不能动画绘制嵌套组件,因为React Native把
<Text>
    string1
    <Text>string2</Text>
</Text>

改为

<RCTTextView>
    string1
    <RCTVirtualText>string2</RCTVirtualText>
</RCTTextView>

RCTVirtualText是一个虚拟组件。

安装

React Native版本要求0.62及以上。

  1. 安装依赖
yarn add react-native-reanimated
  1. 在babel.config.js文件中添加Reanimated的babel插件
module.exports = {
      ...
      plugins: [
          ...
          'react-native-reanimated/plugin',
      ],
  };

注:Reanimated插件必须列在最后。

  1. 原生配置
    Android端
  • android/app/build.gradle
project.ext.react = [
  enableHermes: true  // <- here | clean and rebuild if changing
]
  • MainApplication.java
  import com.facebook.react.bridge.JSIModulePackage; // <- add
  import com.swmansion.reanimated.ReanimatedJSIModulePackage; // <- add
  ...
  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
  ...

      @Override
      protected String getJSMainModuleName() {
        return "index";
      }

      @Override
      protected JSIModulePackage getJSIModulePackage() {
        return new ReanimatedJSIModulePackage(); // <- add
      }
    };
  ...
  • proguard-rules.pro
-keep class com.facebook.react.turbomodule.** { *; }

iOS端

  • 自动安装

相关文章

网友评论

      本文标题:react-native-reanimated系列(一)

      本文链接:https://www.haomeiwen.com/subject/wyyfhltx.html