这一节,我要介绍的是AnimatorSet。

一提到android的动画,一定会涉及到AnimatorSet,因为他太好用了。它所封装的接口让很多复杂的动画叠加变得容易。

AnimatorSet是继承于Animator这个是非常重要的,因为AnimatorSet可以不停的叠加自身,最重要的是他本身就是一个Animator。

我们看一下他播放动画的方法,可以看到它返回的一个Builder的对象,可以推断它是使用建造者的形式,不断迭代动画。

我们看一下他实际构造的时候使用,保存在mCurrentNode的Node对象里面,Node应该是节点的意思。

每个动画都应该由节点构成

其Builder里面存在着三种排序,with,before,after(字面意思应该都很清晰)

(1)with的节点可以看到他是通过Dependency的方法来填充到mCurrentNode里面的,很明显with是并行的

我们可以看到Dependency是只有WITH和AFTER两个时序。

(2)当使用before的时候,相对于mCurrentNode是node节点之后,所以传入mCurrentNode到里面

(3)当使用after的时候,相当于node节点是mCurrent节点之后,所以传入node到里面

使用after延时,其实只是使用一个虚设一个ValueANimator来设定延时时间。

然后我们看一下动画叠加真正的做法。

(1)playTogethor其实是使用with循环的叠加,其参数是不定量的数组的items

我们可以传入Collection的对象,意味着我们可以传入一个列表的Animator

(2)playSequentially是不断使用before来将动画放在之后叠加

setTarget的方法是循环获取node节点的animator动画,终节点通过ObjectAnimator来设置view目标

setInterpolator设置时间插值器,这个插值器最后会在start的方法中是使用

我们接下来看一下动画播放的流程

(1)start的方法会先设置一些标志位,然后通过遍历节点node的animator对象来设置播放同步为false遍历设置每个动画对象的运行时间

还会设置每个对象的时间插值器

当使用play,playTogethor,playSequentially的时候还会标志需要排列节点,如果node节点没有依赖关系的话,全部会被排列到父节点里面,然后再次循环移除node的依赖父节点,加入到tmproot次节点之后,这样会建立一个统一的mSortedNodes的数组

然后通过遍历mSortedNodes数组移除旧的监听器,

设置nodesToStart来控制全部的节点,

然后再次添加上对应的DependecyListener和AnimatorSetListerner

如果判断延时少于0 ,就把节点的animator播放,并加到mPlayingSet里面,

否则添加值ValueAnimator作为延迟空效果,并通过监听器来在遍历播放节点

通过通过回调来调用每个节点监听器的onAnimationStart,

如果判断节点内其全部的节点都被执行完,木有延迟,那么触发节点的onAnimationEnd的方法

start的方法其实还需要涉及到DependecyListener

这里可以看明白,器通过调用onANimationStart和onAnimationEnd判断运行rule的规则来判断是否启动动画

通过判断父AnimatorSet是否被取消返回

然后判断移除dependencies依赖关系

当全部依赖关系满足的时候,就开启动画

(2)使用pause的方法,会让所有延迟的方法暂停,然后调用每个节点里的pause方法

然后循环调用节点里面的onAnimationPause的方法,暂停每个动画。

pause的方法是停止在中间的状态。

resume的方法也是类似的,用来恢复当前pause状态的动画运行

(3)canel的方法中,需要判断是否正在播放

如果正在播放会全部调用节点onAnimationCancel的方法,

然后再遍历调用延时动画的cancel方法和节点动画的cancel方法。

最后出发节点的onAnimationEnd的方法。

触发剩余调用节点onAnimationCancel的方法,

将全部动画监听器移除,将mPlayingSet的动画移除

将剩下的动画onDone状态设置为false,

触发节点的onAnimationEnd的回调方法

cancel之后动画会停留在中间运行的状态

(4)另外一种end的方法也是可以停止动画运行,

可以看到会停止掉延迟,

然后调用每个动画的end方法和onAnimationEnd的方法,

最后设置回start的标志

end和cancel的不同是,调用了end的方法,它会把动画直接发生整个动画的最后一帧然后停止。

关于AnimatorSet的源码分析就到这里了。

android animatorset 监听,Android源码分析--动画框架AnimatorSet相关推荐

  1. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. Android shortcut的使用及源码分析

    Android shortcut的使用及源码分析 最近遇到了一个切换国家码后部分应用的shortcut未更新的问题,就学习了shortcut的相关知识,在这里分享一下我了解的知识,希望能对大家有帮助. ...

  4. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  5. 压枪源码,移动鼠标源码,监听鼠标源码,控制鼠标移动源码,控制鼠标移动脚本

    压枪源码,移动鼠标源码,监听鼠标源码,控制鼠标移动源码,控制鼠标移动脚本 加了很多注释了,肯定能看懂,双开火键,左键正常,侧键直接压开 先ahk官网下载安装后就能直接运行这个ahk文件了 一开始尝试p ...

  6. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  7. SpringMVC源码分析_框架原理图

                                                                                 SpringMVC源码分析_框架原理图     ...

  8. Activiti源码分析(框架、核心类。。。)

    Activiti源码分析(框架.核心类...) 目录 概 述 activiti源码分析(一)设计模式 总结: 相关工具如下: 分析: 小结: 参考资料和推荐阅读 LD is tigger foreve ...

  9. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

最新文章

  1. sql实现两张表的拷贝
  2. 深入理解分布式技术 - Kafka 高性能原理剖析
  3. CVPR 2018 《Towards High Performance Video Object Detection》论文笔记
  4. rpm -e --nodeps_微课 | rpm的思维导图
  5. java学习(54):接口之间的继承
  6. oracle表的incremental,ODI IKM Oracle Incremental Update的四种探测处理策略
  7. java batik_batik详解2
  8. VMware5.5的序列号
  9. 【JSP】div自适应大小
  10. TLSF内存分配器记录
  11. 计算机通信原理电子版,通信原理-西安电子科技大学.PDF
  12. Excel 2016: 录制宏入门
  13. 由两个重要极限推导常见等价无穷小以及常见导数公式
  14. linux watchdog超时时间,S3C2440看门狗定时器(Watchdog)
  15. discuz X程序目录和文件列表 详细中文说明
  16. 数据库中专门的关系运算——除运算
  17. Wannafly挑战赛14 A:直角三棱锥
  18. 上月最新面过美团大众点评拿到offer的最新面经来了(技术三面+HR)
  19. python读写文件的语句_用Python读写文件指南
  20. java集合 — — lterator迭代器

热门文章

  1. 责任链模式在Android中的应用
  2. leetcode--数组(Easy)
  3. 2018.8.2 Juint测试介绍及其命名的规范
  4. 2018 UESTC Training for Data Structures
  5. jquery显示和隐藏元素
  6. 动态规划 所有题型的总结
  7. 在XML里的XSD和DTD以及standalone的使用
  8. mysql获取各种日期
  9. 在ACCESS中使用Group By语句
  10. python-类方法和属性