这篇文章分析 ObjectAnimator 动画是如何动起来的,关于它的父类 ValueAnimator 请看 安卓底朝天 —— android.animation.ValueAnimator.start:: 的调用栈
ObjectAnimator 使用了 ValueAnimator 周期性调用绘制函数的方式(Choregrapher),但由于 ObjectAnimator 要实现的是在动画更新时设置对象(一般是View)的属性,因此它与 ValueAnimator 不同的是动画的更新点。
从这个调用栈可以看出,ObjectAnimator.start::: 调用了 ValueAnimator.start:::,因此会触发函数 android.animation.AnimationHandler.AnimationFrameCallbackProvider.postFrameCallback::Choreographer.FrameCallback: 的递归调用。
我们回顾一下 ValueAnimator.start::: 的调用栈:
android.animation.ValueAnimator.start:::
android.animation.ValueAnimator.start::boolean:
android.animation.AnimationHandler.addAnimationFrameCallback::AnimationFrameCallback,long:
android.animation.AnimationHandler.AnimationFrameCallbackProvider.postFrameCallback::Choreographer.FrameCallback:(这个函数会在下面再次被调用,形成递归)
。。。。。。。。。。。。。。。。。。。。。。。多态。。。。。。。。。。。。。。。。。。。。。。。。
android.animation.AnimationHandler.MyFrameCallbackProvider.postFrameCallback::Choreographer.FrameCallback:
android.view.Choreographer.postFrameCallback::FrameCallback:
。。。。。。。。。。。。。。。。。vertical sync pulse(屏幕刷新时) 。。。。。。。。。。。。。。。。。
android.view.Choreographer.FrameCallback.doFrame::long:
。。。。。。。。。。。。。。。。。。。。。。。多态。。。。。。。。。。。。。。。。。。。。。。。。
android.view.Choreographer.FrameCallback(android.animation.AnimationHandler.mFrameCallback).doFrame::long:(匿名类中的函数)
|—————————下面这个函数在上面出现过—————————|
android.animation.AnimationHandler.AnimationFrameCallbackProvider.postFrameCallback::Choreographer.FrameCallback:(递归了!)
|——————————————————————————————|
android.animation.ValueAnimator.doAnimationFrame::long:
android.animation.ValueAnimator.animateBasedOnTime::long:
android.animation.ValueAnimator.animateValue::float:
android.animation.ValueAnimator.AnimatorUpdateListener.onAnimationUpdate::ValueAnimator:
注意最后两个函数是 ValueAnimator 动画的更新点,而我们前面也说过 ObjectAnimator 动画的更新方式不同于 ValueAnimator,因此我们要看:
函数 ObjectAnimator.animateValue::float: 调用了父类函数 ValueAnimator.animateValue::float:,但更重要的是它自己对这个函数的实现:调用了 android.util.Property.set::T,V:,关于这个函数请看:安卓百宝箱:android.util.*
下面就不总结调用栈了,因为和它的父类差不多,除了函数 animateValue::float: 的实现。
函数 android.animation.Keyframes.FloatKeyframes.getFloatValue::float: 的子类实现为 android.animation.FloatKeyframeSet.getFloatValue::float: