前端知识 | React Native Animated动画浅谈

在移动开发中,动画能有效的提高用户体验。在 React Native 中,也有相应的 API 供我们做动画。这里着重说一下 Animated 动画库,它可以让我们非常简便的去实现各式各样的动画和交互方式,而且具备很高的性能。Animated 目前只封装了四个可以动画化的组件:View、Text、Image、ScrollView,不过你也可以用 Animated.createAnimatedComponent() 来封装你自己的组件。

话不多说,我们来举个栗子:

步骤拆解

1、创建 Animated.Value,设置初始值,比如一个 View 组件的透明度,最开始设置 fadeAnim:Animated.Value(0) 来表示动画开始的时候,是透明的。

2、把创建的这个 Animated.Value 绑定到 Style 的动画属性,例:

3、使用 Animated.timing (还有其他的)来创建自动的动画,或者使用 Animated.event 来根据手势,触摸,Scroll 的动态更新动画的状态。

4、调用 Animated.timing.start() 开始动画, start 接受一个回调函数作为参数,将会在执行了动画之后执行回调函数。

动画模式

如果只是 timing ,肯定是无法满足我们复杂的交互效果的需求的,所以 RN 还给我们提供了另外两种动画模式。

1、spring 弹簧效果

      friction 摩擦系数,默认为40

      tension 张力系数,默认为7

      bounciness

      speed

2、decay 衰变效果

      velocity 出速率

      deceleration 衰减系数,默认为0.997

spring 支持 friction 与 tension 或者 bounciness 与 speed 两种组合模式,这两种模式不能并存。其中 friction 与 tension 模型来源于 Origami ,一款F家自制的动画原型设计工具,而 bounciness 与 speed 则是传统的弹簧模型参数。

栗子不够复杂?

看来一个简单的淡入是无法满足大家的好奇心的,我们整个大点的。

在上面的例子里面,我们实现的是三个动画效果同时进行,因为我们给文字区域加上了字体增大的动画效果,相应地,也要修改 Text 为 Animated.Text

强大的插值 interpolate

相信大家都已经注意到了,我们上面用到了 interpolate 这个函数,也就是插值函数。这个函数很强大,当我们动画的值与要改变的属性值不是同一单位的时候,就可以使用 interpolate 来帮我们进行一个单位的映射转换,比如

当 rotation 这个动画状态的值为0时,那么输出的Z轴上的旋转角度会自动映射成0deg。当 rotation 这个动画状态的值为0.5时,那么输出的Z轴上的旋转角度会自动映射成180deg。以此类推。 InputRange 并不局限于 [0,1] 区间,这个主要取决于你定义的动画的初始值,和想要变化以后的值,并且其间还可以存在多段映射。插值的好处在于我们可以声明一个动画变量来控制多个并行动画,简单易控制。

Interpolate 支持多段区间映射, [0,1] 区间和 [1,2] 区间之间没有什么必然联系,当 rotation 趋近于1时,动画旋转趋近于360deg,当 rotation 趋近于2时,动画也可以旋转回来趋近于200deg,唯一要注意的就是 inputRange 的每一个值都必须有一个 outputRange 里面的值与其对应。

流程控制

在刚才的栗子中,我们使用了 parallel 来实现多个动画的并行渲染,其他用于流程控制的 API 还有:

1、sequence 接受一系列动画数组为参数,并依次执行

2、stagger 接受一系列动画数组和一个延迟时间,按照序列,每隔一个延迟时间后执行下一个动画(其实就是插入了 delay 的 parallel )

3、delay 生成一个延迟时间(默认值为0,单位为毫秒)

第二个栗子稍微修改一下,就可以根据业务逻辑去控制自己的动画流程,在上面的栗子里面,我们让动画首先出现,出现了之后,再同时进行字体变大和旋转两个动画,虽然他们持续的时间和到达的值不一样,但是他们是在 opacity 变为1以后同时开始的。

需要注意的点

可以看到我们上面的动画都是以毫秒级的频率来执行的,也就相当于我们会以毫秒级的频率去调用 setState,而每次调用 setState 都会重新调用 render 方法遍历子元素进行渲染,就算有 dom diff 帮我们算,他也会累的(负担不起这么大的计算量和 UI 渲染量)。这里浅谈几个优化方案,具体收益就只有大家在实际项目中自己体会了。

使用原生驱动

这算是官方给出的一个比较简单的解决方案了,在动画中启用原生驱动非常简单。只需在开始动画之前,在动画配置中加入一行 useNativeDriver:true 。

ShouldComponentUpdate

大家都知道,ShouldComponentUpdate 是性能优化利器,只需要在子组件的 ShouldComponentUpdate 返回 false,就可以省去很多多余渲染花费。这样做也有一个弊端,毕竟我们的子元素并不是一成不变的,这样粗暴的直接返回 false 的话,会让子元素变成一滩死水,所以使用的时候请权衡利弊。

SetNativeProps (局部刷新)

可能这都不算是动画的的优化方案,但是却可以直接改动组件并触发局部的刷新。使用这个方法修改 View、Text 等 RN 自带的组件,就不会触发组件的 componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate 等组件生命周期中的方法。

LayoutAnimation

这也是官方给的一个比较简单的动画解决方案,它允许我们在全局范围内创建和更新动画,这些动画会在下一次渲染或布局周期运行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容