Android动画原理分析

计算机软件开发 2024-10-7 14:51:11 95 0 来自 中国
简朴形貌为:将View的一次大的属性变革拆分为多次小的属性变革,在每次VSYNC信号到来时,根据当前时间和插值器来盘算当前View属性的值,然后给该View设置该属性值,直到动画实行完毕。此中Choreographer将动画拆分成一次次小的属性变革,Choreographer是动画的指挥者。理想环境下,属性刷新次数(动画拆分为多次小的属性变革)=动画实行时间/16.7ms。
我们从以下4个题目来讲授动画原理:
1:动画怎样完成一次属性变革刷新?
点击按钮,开始实行透明度动画,直到动画竣事。
2.png 下面就第一个题目举行源码分析,
起首从valueAnimator.start()开始:
4.png 1 设置相干标记位
2 这是个关键方法,动画循环中在该方法中实现。
3 初始化相干属性。
继承看焦点方法:


6.png 由于ValueAnimator实现了AnimationHandler.AnimationFrameCallback接口。
1 动画开始实行时,mAnimationCallbacks.size是为0的,以是就会实行判断语句内里的方法getProvider().postFrameCallback(mFrameCallback);
2 将ValueAnmiator(实现了AnimationFrameCallback)添到场mAnimationCallbacks列表。
下面分析这句代码
8.png                                         是一个接口调用,下面我们看是谁实现了这个接口。


9.png 10.png

1 Choreographer收到VSYNC都会调用该方法,正常环境下16.7ms就会调用一次doframe。
2 再次将本身post到编舞者中,以便下次收到底层信号时,继承调用doFrame来刷新动画。


1 callback就是我们添加到mAnimationCallbacks列表中的ValueAnimator
2 实行ValueAnimator的doAnimationFrame方法;


1 在animateBaseOnTime中刷新View属性,并判断动画是否实行完毕
2 如果动画竣事实行endAnimation。
14.png 1 起首将done布尔值为false,体现动画是否实行完毕,
2 这个值在ValueAnimator.startAnimator中将mRunning设置为true。
3 根据当前时间currentTime来判断动画是否实行完毕。
4 将dong值设置为true
5 盘算当前View属性值,然后设置View相干属性。
下面继承看
1 getTarget返回的就是ValueAnimator valueAnimator = ObjectAnimator.ofFloat(mButton, "alpha", 1.0f, 0f);这句中的View也就是mButton。
2 调用父类,重要是盘算当前动画的进度。
3 调用PropertyValueHolder.setAnimatorValue设置mButton在该帧的透明度
下面分析一下父类ValueAnimator的animateValue方法
1 根据插值器盘算当前属性动画的进度。
2 android.animation.PropertyValuesHolder#calculateValue 
17.png 将当前进度存放到PropertyValuesHolder.mAnimatedValue中,在AnimatorUpdateListener.onAnimationUpdate方法中可以通过ValueAnimator.getAnimatedValue获取动画进度。
3 回调AnimatorUpdateListener.onAnimationUpdate方法。


1 如果有属性,通过set方法来更新属性值。
2 如果须要通过反射来调用的setter方法来更新属性值。
以上流程就是完成了mButton透明度的一次更新,同时也分析确动画是怎样完成一次属性变革的刷新。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-12-4 01:47, Processed in 0.153273 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表