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

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


步骤拆解


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

2、把创建的这个 Animated.Value 绑定到 Style 的动画属性,例:<View style={{opacity:this.state.fadeAnim}}></View>

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


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

转载于:https://blog.51cto.com/13476205/2050989

前端知识 | React Native Animated动画浅谈相关推荐

  1. React Native Animated动画

    在React Native中,我们可以通过两种方式实现一个动画效果: LayoutAnimation Animated 关于LayoutAnimation,我之前写过一篇学习博客(React Nati ...

  2. React Native Animated 动画详解 - 实例篇 (这篇就够了)

    之前已经更新过Animated动画基础篇相关知识点,今天讲解Animated.Value,Animated.ValueXY以及相关动画库使用实例.学习完 本篇相信大家对于动画库的基本使用应该是没有问题 ...

  3. 前端知识 | React Native手势响应浅析

    目前手机市场上,全面屏时代已经势不可挡,为了增大屏幕,一个个物理按键已渐渐消失在手机上.那么,手势将成为在移动应用开发中一个重要的组成部分,移动设备上手势识别要比 web 端复杂得多,往往用户的一个手 ...

  4. iOS 自定义转场动画浅谈

    代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...

  5. 谈计算机知识对学生的作用,浅谈计算机在教学中的作用

    浅谈计算机在教学中的作用 时间:2017-07-19 08:54:57 浅谈计算机在教学中的作用 计算机基础教育的教学目标是使学生掌握计算机的基本知识和操作技能,把计算机作为获取和交流信息的工具,为学 ...

  6. 教育教学知识与能力小学计算机,浅谈小学计算机教学论文

    在小学的教育中,计算机教学也成为了非常重要的教学内容,但是从现阶段小学计算机教学的实际情况看还存在很多需要去解决的问题,只有采取合理的对策和措施去有效解决当前存在的问题,才能有效提高小学计算机教学质量 ...

  7. Web前端:React Native Web与React — 比较指南

    ​ React 是Facebook开发的用于构建交互式用户界面的JavaScript库.React 在 Apache 许可下作为开源软件提供,可用于个人和商业网站.客户端 Web 应用程序和服务器应用 ...

  8. 谈计算机知识对学生的作用,浅谈中学生计算机教育的意义.doc

    浅谈中学生计算机教育的意义.doc 浅谈中学生计算机教育的意义 计算机教育是一项面向未来的现代化教育,是培养学生计算机技能,提高学生科学文化素质,培养跨世纪人才的重要途径.在基础教育由"应试 ...

  9. web前端技术基础课程讲解之浅谈对soket的理解

    浅谈对soket的理解 定义: 网络上的两个程序通过一个双向的通信链实现数据的交换,这个链接的一端就成为Socket 它是进程通信的一种,即调用这个网络库的api函数实现分布在不同主机相关进程之间的数 ...

最新文章

  1. VMware几个版本的比较
  2. python的random模块生成随机数
  3. 企业中两个重要而又容易被忽视的角色,互联网营销
  4. pandas to_dict 的用法
  5. 企业级管理软件快速开发平台-完整的权限管理设计
  6. 网络图片 base64 java_java图片转base64和真实的结果不一样
  7. 全国Python科研应用专题实操培训班
  8. python基本代码教程-python基础教程
  9. 怎么关闭服务器系统自动更新,自动更新怎么关闭 如何关闭window自动更新提高运行速度...
  10. 模糊综合评价在实际问题中的应用(案例)
  11. 计算机科学与工程版面费,《计算机工程与设计》版面费问题 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  12. arcgis,裁剪投影不一致的矢量和栅格
  13. NTC电阻在电源输入端的应用-测试案例
  14. 数据库是什么,它是做什么用的?
  15. 原生JS制作抽奖小游戏
  16. 圆桌骑士 图的连通性
  17. Go基础天天练之通道
  18. PADS原理图与PCB转到AD或者高版本PADS转出文件给低版本使用
  19. linux给文件夹及子文件(夹)授权
  20. pythonhtml生成word_html转word

热门文章

  1. 在线式测斜仪是一款新型的、智能的、适应多种行业应用的三轴智能测斜仪
  2. 【沙发管家】华为荣耀盒子Pro如何通过U盘安装第三方应用
  3. 几个好用的hexo主题
  4. 「高稳定性」视频播放器养成计划
  5. 泉州dns服务器无响应,网络连接正常但就是网速较慢还修复不了为什么
  6. java练习本(2019-08-16)
  7. 再见,季后赛的马刺!再见,老爷子!
  8. React-Native一款社交软件
  9. UI设计师必须知道的大厂设计规范
  10. python中字典的dic.setdefault()用法