Android源码分析--动画框架AnimatorSet

我系苍王,多谢观看我这一个系列的课程,之前分析了Small插件化源码分析,近来看了Android里面的动画框架的相关代码,希望对感兴趣的同学一些帮助。


这一节,我要介绍的是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的源码分析就到这里了。

下一节内容敬请期待!!!

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

推荐阅读更多精彩内容