iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用react native reanimated实现动画
  • 658
分享到

怎么使用react native reanimated实现动画

2023-07-05 09:07:33 658人浏览 八月长安
摘要

这篇“怎么使用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实现动画”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用react native reanimated实现动画

本文链接: https://www.lsjlt.com/news/350884.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么使用react native reanimated实现动画
    这篇“怎么使用react native reanimated实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2023-07-05
  • react native reanimated实现动画示例详解
    目录背景动画拆分实现抖动定义动画实现缩放动画改变内容Reanimated 原理浅析总结背景 在一次 App 迭代中,UI 想要给按钮添加一个动画效果,在对接的过程中,UI 表示直接...
    99+
    2023-03-06
    react native reanimated 动画 react native reanimated
  • 怎么使用Framer Motion实现React动画
    这篇文章主要介绍“怎么使用Framer Motion实现React动画”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Framer Motion实现React动画”文章能帮...
    99+
    2023-07-04
  • React Native项目中使用Lottie动画的方法
    Lottie是Airbnb开源的一个面向iOS、Android、React Native的动画库,能加载Adobe After Effects导出的动画,并且能让原生App像使用静态...
    99+
    2024-04-02
  • React Native中怎么实现动态导入
    这篇文章主要介绍“React Native中怎么实现动态导入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React Native中怎么实现动态导入”文章能帮助大家解决问题。背景...
    99+
    2023-07-02
  • React Native Popup怎么实现
    这篇文章主要介绍“React Native Popup怎么实现”,在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-06-30
  • 怎么用react native实现圆弧拖动进度条
    这篇“怎么用react native实现圆弧拖动进度条”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用react nat...
    99+
    2023-06-05
  • React中怎么实现常见的动画
    这篇文章主要介绍React中怎么实现常见的动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!现在,用户对于前端页面的要求已经不能满足于实现功能,更要有颜值,有趣味。除了整体 UI 的...
    99+
    2024-04-02
  • 聊聊React Native中怎么利用echarts画图表
    google 了一下,说是需要降级解决。其实是要跟 expo 版本对应,在安装依赖的时候也会有类似这样的提示,安装提示的版本就可以了于是按照提示做了版本降级:@shopify/react-native-skia@0.1.157 react-...
    99+
    2023-05-14
    React Native ECharts
  • 使用jQuery怎么实现动画
    小编今天带大家了解使用jQuery怎么实现动画,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“使用j...
    99+
    2024-04-02
  • react native路由跳转怎么实现
    本教程操作环境:Windows10系统、React Native0.67版、Dell G3电脑。react native路由跳转怎么实现?React Native-路由跳转搭建完RN开发环境后,要实现多个页面之间的跳转。 1.这时需要安装r...
    99+
    2023-05-14
    react-native
  • 使用react native 怎么实现一个微信聊天室
    本篇文章给大家分享的是有关使用react native 怎么实现一个微信聊天室,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。、技术点MVVM框...
    99+
    2024-04-02
  • 使用react-native-doc-viewer实现文档预览
    目录react-native-doc-viewer文档预览具体步骤如下react-native初体验的总结一、前提知识点二、开发前后相关的一些配置三、开发项目中用到的知识四、ui库五...
    99+
    2024-04-02
  • React Native react-navigation导航怎么用
    这篇文章将为大家详细讲解有关React Native react-navigation导航怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、开源库介绍Fb推荐使用库...
    99+
    2024-04-02
  • 使用react-native-image-viewer实现大图预览
    目录react-native-image-viewer大图预览先看一个实现的效果实例下面是一个简单的实例代码Propsreact-native-image-viewer大图预览 在移...
    99+
    2024-04-02
  • React-Native中props怎么用
    这篇文章将为大家详细讲解有关React-Native中props怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。props就是属性,是为了描述一个组件的特征而存在的。...
    99+
    2024-04-02
  • Vue3之怎么使用js实现动画
    这篇“Vue3之怎么使用js实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3之怎么使用js实现动画”文章吧。概...
    99+
    2023-07-05
  • 怎么使用vue实现动画效果
    这篇文章主要介绍了怎么使用vue实现动画效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用vue实现动画效果文章都会有所收获,下面我们一起来看看吧。Vue封装的过度与动画1.作用在插入,更新,移除DOM...
    99+
    2023-07-05
  • 怎么使用js实现动画效果
    这篇文章主要介绍“怎么使用js实现动画效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用js实现动画效果”文章能帮助大家解决问题。1.动画原理      &nb...
    99+
    2023-07-05
  • react-native如何实现圆弧拖动进度条
    这篇文章主要为大家展示了“react-native如何实现圆弧拖动进度条”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“react-native如何实现圆弧拖动进...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作