React Native 新架构实战课
蒋宏伟
58 同城前端架构师,58RN 负责人
18214 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
React Native 新架构实战课
15
15
1.0x
00:00/00:00
登录|注册

14|Reanimated:如何让动画变得更流畅?

你好,我是蒋宏伟。
今天我们来聊一聊 React Native 中动画的原理。在开始之前,我想请你思考一下:动画的本质到底是什么?
你可能知道,与真实世界中连续运动的事物不同,我们在手机、电脑、电影院的屏幕中看到的动画,实际是由一张张快速切换图片组成的。看动画时,我们的眼睛接收到的是一张张并不连续的静态图片,但我们的大脑把这些不连续的图片“想象”成了一系列连续事件,这就是动画的基本原理。
而手机动画要想流畅,一般而言需要保证每 1 秒渲染 60 帧的速度。这里的每一帧都是一张静态图片,也就是说 1 秒钟需要渲染出 60 个静态图片。这也意味着手机处理每一帧动画的耗时,需要保证在 16.6ms(=1000/60)以内,如果处理一帧的耗时超过 16.6ms ,就会掉帧。掉帧多了,我们的大脑就会感觉到动画中的不连续性,也就是常说的卡顿。
动画对渲染性能的要求很高。理论上,你可以使用 setInterval 每 16.6ms 执行一次 setState 改变状态,渲染新的视图,来实现动画。但实际上,setState 是一种耗时比较长的更新页面的方法,特别是在复杂页面、复杂交互的情况下,setInterval + setState 的方案并不适合用来实现动画。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

React Native中实现流畅动画的关键在于选择合适的动画库。动画的本质是由一张张快速切换的静态图片组成,为了保证手机动画流畅,需要每秒渲染60帧。在本文中,作者指出了使用setInterval + setState的方法在复杂页面、复杂交互情况下并不适合实现动画,因为setState是一种耗时较长的更新页面的方法。因此,在涉及动画的业务场景中,需要引入动画库来保障动画的流畅性。文章还详细介绍了React Native中常用的三种动画工具,包括适合轻量级动画场景使用的React Native自带的动画。此外,文章还详细介绍了Reanimated动画库的使用方法,包括共享值、衍生值、动画组件和更新共享值等概念。通过对比State和Reanimated的更新机制,读者可以更好地理解Reanimated动画库的使用方式。通过示例代码和对比分析,读者可以更好地理解Reanimated动画库的使用方法,为实现流畅动画提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《React Native 新架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • Wcly👺
    请问现在Reanimated支持RN新架构了吗?

    作者回复: 支持了

    2022-11-28归属地:北京
    1
  • worm
    老师您好,Reanimated 是如何把 JS 动画代码放到 UI 主线程的 JS 虚拟机中的呢?这部分是 C++ 实现的吧?有没有这部分的讲解材料或者实现的源码位置?

    作者回复: 简单的讲,执行 JavaScript 代码(字符串)依赖的是 JavaScript 引擎,而 JavaScript 函数调用时,可以把 aWorklet 函数和其上下文告诉 JavaScript 引擎,然后再在 UI 线程单独开一个同步的上下文执行。 官方视频如下:https://swmansion.com/academy/webinars/krzysztof-magiera-reanimated-2/ 官方伪代码如下: ---JavaScript--- const CHANCE = 0.6; function notAWorklet(hotDogOrNot){ lemmeUpdateSomeReeduxx({ isHotDog: hotDogOrNot }); } function aWorklet(thing){ 'worklet'; const decide = Math.random() > CHANCE; notAWorklet(decide); } ---C++--- aWorklet.asString ='function aWorklet(thing){ const decide = Math.random() >0' aWorklet.closure ={ CHANCE,notAWorklet }

    2022-05-11
    1
  • happy
    老师,问个问题。被RN的动画抓狂,想实现一个ScrollView,内部有很长的列表,然后要实现一个切换scrollView的高度的动画,内容的不会动。整体就是高度变大变小的一个动画,感觉都很难实现。。。Animated提供的貌似都是transform之类的动画,没有设置height的这种动画吗?

    作者回复: 这个需求有点奇怪,能具体描述一下吗

    2022-07-29归属地:北京
  • *****
    有人碰到过 android debug 时 demo crash吗?
    2024-03-12归属地:福建
    1
  • 见字如晤
    我记得 react-native-gesture-handler 也是使用了 UI线程,都交给 UI 线程,UI 线程会不会也“不堪重负”?
    2022-06-08
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部