问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

ReactNative-Animated动画小结

发布网友 发布时间:2024-09-05 23:18

我来回答

1个回答

热心网友 时间:2024-10-05 19:38

前言

ReactNative一共提供了两种动画,一种是可以绘制自定义动画的Animated库;另一种是负责布局动画的LayoutAnimation。Animated旨在以声明的形式来定义动画,今天主要介绍Animated。

创建动画

官网给出的创建动画的步骤:

ThecoreworkflowforcreatingananimationistocreateanAnimated.Value,hookituptooneormorestyleattributesofananimatedcomponent,andthendriveupdatesviaanimationsusingAnimated.timing().

将上面的长句翻译并拆开后,我们知道,创建一个Animated动画分三步:

创建一个Animated.Value。

将创建的Animated.Value连接到动画组件的一个或多个属性。

使用Animated.timing等方法更改Animated.Value。

接下来我们看看这三句话里提到的一些名词都是什么。

Animated.Value

Animated提供了两种类型的值:

Animated.Value()用于单个值。

小技巧:可以使用Animated.Value().interpolate()方法来做值的映射,从而让Animated.Value()?对应多个值。

Animated.ValueXY()用于矢量值。

使用Animated.Value最终要的一点是:不要直接修改动画值!,要使用Animated提供的方法来修改动画值,如setValue()方法等。这也就意味着,在函数组件中使用state来保存动画值的话,setState是永远都不会被用到的。所以建议在函数式组件中使用useRef保存动画值,在类组件中使用state来保存动画值。

constopacity=useRef(newAnimated.Value(initialValue)).current;动画组件

常规的组件必须经过处理才能用于动画,所谓的特殊处理主要是指把动画值绑定在属性上,并且在一帧帧执行动画时避免react重新渲染和重新调和的开销。此外还得在组件卸载时做一些清理工作,使得这些组件在使用时是安全的。

Animated提供了处理组件的方法:Animated.createAnimatedComponent(),该方法接受一个字符串——组件的名称,并返回一个动画组件:

constAnimatedButton=Animated.createAnimatedComponent('MyButton');

此时就可以使用AnimatedButton来进行动画属性的绑定操作了。

另外,对于一些常用的组件,Animated默认提供它们对应的动画组件:

Animated.Image

Animated.ScrollView

Animated.Text

Animated.View

Animated.FlatList

Animated.SectionList

当然,这些默认提供的组件也都是用createAnimatedComponent这个方法封装得来的。

动画类型

Animated提供了三种动画类型:

Animated.decay()以指定的初始速度开始变化,然后变化速度越来越慢直至停下。

Animated.spring()提供了一个基础的弹簧物理模型.

Animated.timing()使用easing函数让数值随时间动起来。

其中最常用的是timing()

statictiming(value,config);

config有以下参数:

duration:动画的持续时间(毫秒),默认值为500。

easing:缓动函数。默认为Easing.inOut(Easing.ease)。

delay:开始动画前的延迟时间(毫秒),默认为0。

isInteraction:指定本动画是否在InteractionManager的队列中注册,而Interactionmanager可以将一些耗时较长的工作安排到所有互动或动画完成之后再进行,这样可以保证JavaScript动画的流畅运行,默认值为true。

useNativeDriver:启用原生动画驱动。默认不启用(false)。

这里的useNativeDriver的具体作用和使用技巧将在下一篇讲解。

绘制进度条

先来画一个简单的进度条,效果为:进入页面后,进度条变长的同时,颜色也由绿色渐变为红色。

再看代码:

constApp=()=>{//使用ref来保存Animated.Value动画值constwidthX=useRef(newAnimated.Value(0)).current;useEffect(()=>{//表示进入页面后三秒钟时间内widthX变量从0变化到375,记住最后一定要有start()来启动动画。Animated.timing(widthX,{toValue:375,duration:3000,useNativeDriver:false,}).start();},[]);return(<Viewstyle={styles.container}><Animated.Viewstyle={{height:20,width:widthX,//这里用到了interpolate方法来进行插值计算,一个动画值对应了两个属性backgroundColor:widthX.interpolate({inputRange:[0,375],outputRange:['green','red'],}),}}></Animated.View></View>);};conststyles=StyleSheet.create({container:{backgroundColor:'#ffffff',flex:1,justifyContent:'center',},});

上面的代码中,我们使用到了一个在写动画时经常会用到的一个方法interpolate,这个方法可以对动画值做一个映射,这样我们可以用一个动画值来绑定多个属性。

复杂动画思想

上面的动画比较简单,在实际开发过程中,我们经常会碰到比较复杂的动画效果。这时候不要慌,复杂动画无非就是简单动画的组合,中心思想就是对动画进行“分解”。复杂动画无非就是对平移,渐变,旋转等简单动画的组合封装。

比如想要实现上图的红包浮动的效果,可以将动画拆解为中间的卡片变小的同时,两边的卡片变大;中间的卡片变大的同时,两边的卡片变小,但三张卡片的间距始终不变。这样浮动效果就实现出来了。

手势动画

上面的介绍的动画都是使用timing()方法,要么在进入页面后,要么在触发了某个事件后,动画开始启动。实际开发中,我们经常还会遇到另外一种动画:跟手势相关的动画。

这里我们举一个头部渐变效果的例子,大部分App都有导航栏渐变效果,即随着页面上滑,头部的导航栏缓慢浮现。

这里只需要三行核心代码即可实现:

//1.声明动画值保存页面已滚动的长度constscrollY=useRef(newAnimated.Value(0)).current;//2.使用Animated.event方法将event.nativeEvent.contentOffset.y的值即Y轴的移动距离映射到了scrollY上。<ScrollViewonScroll={Animated.event([{nativeEvent:{contentOffset:{y:scrollY}}}])}></ScrollView>//3.将scrollY通过interpolate方法映射到透明度上,当页面滑动距离为0->100时,状态栏的不透明度也会相应地从0->1。<Viewstyle={{opacity:scrollY.interpolate({inputRange:[0,100],outputRange:[0,1]})}}></View>

这里用到了Animated.event()方法,这个方法一般会结合ScrollView组件的onScroll属性或者PanResponder类里面的方法使用。

总结

这篇文章主要是带大家入门ReactNative自带的Animated动画库,学习和了解了简单动画的画法以及复杂动画的思想。不过大多数时候,我们会发现动画经常会有卡顿的问题,下一篇文章,我们主要探讨如何解决动画卡顿的问题,以及一些处理技巧。

原文:https://juejin.cn/post/7100068545953792030
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
PDMS工程师PDMS ...脖子到肩膀中间的地方有个像枣一样大小的肉疙瘩,我很害 ...无法找到和您现有硬件兼容的任何驱动程序。该怎么解决问题? 我的苹果4手机md198zp/a序列号dnqhdtz1dpmw是那一年的机子 请问这是苹果手机的型号吗.MD198cH/A 序列号,DX3KHJ74DPMW请问这部手 ... 手机型号:MD198ZP/A 序列号:C39H1UK1DPMW 是不是翻新机啊?IMEI :01 2... 苹果MD198ZP序列号是C38H16H6DPMW 帮忙看下手机情况, 谢谢 我的iphone4的型号是MD198ZP,序列号是DNTH712LDPMW,麻烦帮我查查这个是... 型号:MD198ZP 序列号:C39H1C84DPMW ...是MD198ZP序列号是DNQH61C0DPMW可是IMEI号手机和包装盒不一样是不... 某个字段重复了,怎么让结果只显示一条数据 react native 中文 郑莎生平 ReactNative架构解析-一张图了解Fabric 彩楼记潮剧曲目 烟雨江湖六扇门怎么进-六扇门进入方法 烟雨江湖六扇门怎么进 烟雨江湖六扇门怎么进攻略 七月的核桃能和葫芦头蜂子窝一起泡酒吗? 哪里有二手桌椅板凳 初中八年级(人教版)物理实验题 我要10道 好的我会给财富悬赏 不要文库... 八年级物理实验问题! (2012?义乌市)如图是八年级下册研究性学习课题《化学反应中质量守恒的研... 家里阴气重哪几种花不能养 家里养花阴气重吗 猫咪怀孕期间要注意哪些问题 辣椒还有什么叫法 万里长城什么时候建的,有多长? 如何看待朋友的比较? 如何正确看待比较 2022年/2023年,有哪些高性价比手机推荐? 2023年,直屏手机推荐,选购攻略 陇南洋芋糍粑背后的制作工艺是怎样的? 圣甲虫妈妈为什么要把梨形粪球的外层压紧压实 ReactNative资源更新增量包的优化实践 牧羊青年认为圣甲虫的梨形粪球中有什么 屎壳郎的粪球为什么是圆的 如何用索爱K33蓝牙耳机设置 小天才电话手表用什么卡好? 台式机蓝牙设置_台式怎么支持蓝牙 小天才z5用什么电话卡? 丹媚左炔诺孕酮肠溶片吃后两小时不能吃东西吗 武汉出发到黄山自驾游路线及高速费用 襄阳到贵州自驾游最佳路线,襄阳到贵阳旅游路线 微信怎么下载公开的视频? 微信朋友发的小视频在哪里下载? 微信小视频如何下载? 地源热泵和空调哪个好 蘑菇、长足虻与沫蝉 前几天男朋友梦见几条巨虻,打死一条,过了两三天我又梦见蛇咬我还出血了... 别墅地源热泵真的那么好吗 ...不知道练谁的 大家推荐下 我想先从楷书开始练。然后行楷_百度...
  • 焦点

最新推荐

猜你喜欢

热门推荐