我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用react native reanimated实现动画

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用react native reanimated实现动画

这篇“怎么使用react native reanimated实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用react native reanimated实现动画”文章吧。

动画拆分

首先,从最外层来看,动画有一个抖动效果:先向左,再向右。可以利用 rotate 旋转属性来实现。

其次,中间的文字部分有一个缩放动画,可以通过 scale 实现。

最后,当文字最小化时,会改变内容,这个需要配合 JS 来实现。

实现抖动

首先通过 useSharedValue 定义一个共享值 rotation,共享值和 useRef 类似,区别是共享值有一个 value 属性而不是 current

我们使用共享值改变的样式通过 useAnimatedStyle 包装一下,再赋值给 Animated.View,这和使用普通的 React Native 样式有点区别:

import Animated from 'react-native-reanimated';const rotation = useSharedValue(0);const shakeStyle = useAnimatedStyle(() => {    return {      transform: [        {          rotateZ: `${rotation.value}deg`,        },      ],    };  }, []);<Animated.View style={[styles.btn, shakeStyle]}>...</Animated.View>

定义动画

每个动画可以使用 withTiming 更新共享值,并设置动画的具体参数。它会启动基于时间的动画曲线,如执行时间 duration,缓动函数 easing 等。

抖动的过程有三个步骤:向左旋转,向右旋转,保持水平。我们使用 withSequence 来编排动画的顺序。

最后,我们使用 withRepeat 让以上三个步骤无限循环。它接受三个参数:

  • 第一参数是动画函数;

  • 第二个参数是执行的次数,-1 表示无限次;

  • 第三个参数表示动画是否反向执行。

注意,在恢复水平后,按钮仍保持一段时间的静止,我们可以用到 withDelay 来延迟执行下一个动作。

const SCOPE = 2;useEffect(() => {    const turnL = withDelay(1400, withTiming(-SCOPE, { duration: 100, easing: Easing.linear })); // 向左    const turnR = withTiming(SCOPE, { duration: 100, easing: Easing.linear }); // 向右    const holden = withTiming(0, { duration: 100, easing: Easing.linear }); // 水平const rotateAnimations = withSequence(turnL, turnR, holden); // 编排动画顺序    rotation.value = withRepeat(rotateAnimations, -1); // 重复执行动画    return () => {      cancelAnimation(rotation);    };}, []);

实现缩放动画

实现缩放动画的思路与上面基本相似。这里需要注意的是,需要根据实际需求,调整动画之间的节奏关系。比如缩放开始,抖动开始;缩放结束,抖动也就结束。

const scaleSize = useSharedValue(0.2);const scaleStyle = useAnimatedStyle(() => {return {      transform: [        {          scale: scaleSize.value,        },      ],};}, []);useEffect(() => {...const zoomOut = withDelay(1600, withTiming(0.2, { duration: 100, easing: Easing.linear }));const restoreSize = withTiming(1, { duration: 100, easing: Easing.linear });const scaleAnimations = withSequence(restoreSize, zoomOut);scaleSize.value = withRepeat(scaleAnimations, -1);return () => {...cancelAnimation(scaleSize);};}, [])<Animated.View style={[styles.textWrapper, scaleStyle]}>...<Animated.View>

改变内容

当我们依赖共享值的变化,需要进一步操作时,可以使用 useAnimatedReaction,它第一参数中定义依赖的值,第二个参数接受第一个参数的返回值,并进行自定义的操作。

注意,共享值变化不会触发 JS 线程中的组件更新,改变文案的状态需要用到 useState,因为文案改变是在 JS 线程中处理的,可以通过 runOnJS 可以让函数在 JS 线程中执行。

import { useAnimatedReaction, runOnJS } from 'react-native-reanimation'; ...const [status, setStatus] = useState(true);const scaleSize = useSharedValue(0.2);const toggle = useCallback(() => {    setStatus((s) => !s);}, []);useAnimatedReaction(    () => {      return scaleSize.value;    },    (next) => {      if (next <= 0.2) {        runOnJS(toggle)();      }    });...<Text>{status ? '参与话题' : '赚点赞次数'}</Text>

Reanimated 原理浅析

在开发过程中,我们的动画代码和状态代码都是用 JavaScript 写在同一个文件中的,你可能会认为你写的动画部分的 JavaScript 和状态部分的 JavaScript 都是运行在同一个线程中的, 但其实并不是这样的。

React Native 有两个常用的线程:一个是 React Native 的 JavaScript 线程,另一个是 UI 主线程。

一方面,JavaScript 线程和 UI 主线程是异步通信的,这也意味着,如果是由 JavaScript 线程发起动画的执行,UI 线程并不能同步地收到该命令并且立刻执行。

另一方面,JavaScript 线程处理的事件很多,包括所有的业务逻辑、React Diff、事件响应等,容易抢占动画的执行资源。

Reanimated 是如何优化?答案就是:把动画代码放到 UI 主线程来执行性能更好、不易卡顿。

它把动画相关的 JavaScript 函数及其上下文传给了 UI 主线程。由于 UI 主线程没有能够运行 JavaScript 的环境,于是 Reanimated 又创建了一个 JavaScript 虚拟机来运行传过来的 JavaScript 函数。

怎么使用react native reanimated实现动画

在 JavaScript 线程中包括了三个动画相关的函数或值, useSharedValueuseAnimatedStyleuseAnimatedGestureHandler

这三部分的代码会在其底层,将相关的回调函数标记为worklet ,被标记的worklet函数或值会被放在一个由 Reanimated 创建的 JavaScript 虚拟机中执行。而这个由 Reanimated 创建的 JavaScript 虚拟机,会在 UI 线程中执行传过来的worklet 函数,并且执行的函数还可以同步地操作 UI。

Reanimated 动画性能好的原因就在于:React Native 的 JavaScript 线程是性能瓶颈点,而在真正执行动画时,已经把所有与动画相关 JavaScript 函数都放到了 UI 线程中独立的 JavaScript 虚拟机中了,并不会和 JavaScript 线程抢占硬件资源。

以上就是关于“怎么使用react native reanimated实现动画”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用react native reanimated实现动画

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用react native reanimated实现动画

这篇“怎么使用react native reanimated实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用r
2023-07-05

react native reanimated实现动画示例详解

这篇文章主要为大家介绍了react native reanimated实现动画示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-06

怎么使用Framer Motion实现React动画

这篇文章主要介绍“怎么使用Framer Motion实现React动画”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Framer Motion实现React动画”文章能帮助大家解决问题。在我
2023-07-04

React Native Popup怎么实现

这篇文章主要介绍“React Native Popup怎么实现”,在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React Native
2023-06-30

React Native中怎么实现动态导入

这篇文章主要介绍“React Native中怎么实现动态导入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React Native中怎么实现动态导入”文章能帮助大家解决问题。背景随着业务的发展,每一
2023-07-02

怎么用react native实现圆弧拖动进度条

这篇“怎么用react native实现圆弧拖动进度条”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用react nat
2023-06-05

聊聊React Native中怎么利用echarts画图表

React Native中怎么画图表?下面本篇文章就来给大家介绍一下怎么使用React Native+Echarts开发一个真实的电商数据统计页面,希望对大家有所帮助!
2023-05-14

react native路由跳转怎么实现

react native路由跳转的实现方法:1、使用“yarn add react-navigation”命令安装“react-navigation”;2、通过“yarn add react-native-gesture-handler”命令安装“react-native-gesture-handler”组件;3、设置好初始路由,然后以类的组件的形式导出即可。
2023-05-14

怎么使用vue实现动画效果

这篇文章主要介绍了怎么使用vue实现动画效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用vue实现动画效果文章都会有所收获,下面我们一起来看看吧。Vue封装的过度与动画1.作用在插入,更新,移除DOM
2023-07-05

怎么使用js实现动画效果

这篇文章主要介绍“怎么使用js实现动画效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用js实现动画效果”文章能帮助大家解决问题。1.动画原理 1.获得盒子当前位置
2023-07-05

Vue3之怎么使用js实现动画

这篇“Vue3之怎么使用js实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3之怎么使用js实现动画”文章吧。概
2023-07-05

JS怎么使用window.requestAnimationFrame()实现逐帧动画

这篇文章主要讲解了“JS怎么使用window.requestAnimationFrame()实现逐帧动画”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么使用window.request
2023-07-02

react怎么实现滑动

react实现滑动的方法:1、在onTouchStart事件找到touches,根据identifier中记录新的touch出现;2、在onTouchMove事件中根据identifier来记录每个touch经过的点的坐标;3、在onTouchEnd事件中,找到结束的touch事件,然后通过结束的touch事件划过的点来计算要执行的手势即可。
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录