ValueAnimator基于Choreographer frame callback 通过判断当前时间,调用View相关属性,刷新UI实现动画效果。
其中核心是AnimationHandler。AnimationHandler, 是一个静态单例Handler供所有的Animator调用,内部基于Choreographer周期callback更新UI frame,使用ThreadLocal方式实现同步。
其中AnimationFrameCallbackProvider抽象了封装Choreographer的接口,用户可以自实现基于其他形式的刷新接口,因为Choreographer是基于实际硬件的UI刷新机制接口,自定义适用于非硬件形式的测试。
postFrameCallback(Choreographer.FrameCallback callback)
postCommitCallback(Runnable runnable) {
而内部类MyFrameCallbackProvider作为默认封装Choreographer处理动画的机制Provider接口
那如何实现动画的机制呢?答案是向Choreographer注册FrameCallback ,每次到frameTime时执行动画刷新UI,再注册,当前接口
private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
doAnimationFrame(getProvider().getFrameTime());
if (mAnimationCallbacks.size() > 0) {
getProvider().postFrameCallback(this);
}
}
};
其中doAnimationFrame就是我们的动画执行函数接口,那我们需要对上层动画抽象执行动画的函数接口。doAnimationFrame处理所有实现AnimationFrameCallback 接口的doAnimationFrame()
interface AnimationFrameCallback {
boolean doAnimationFrame(long frameTime)
}
AnimationHandle维护frame callback队列,
private final ArrayList<AnimationFrameCallback> mAnimationCallbacks =
new ArrayList<>();
AnimationHandler向上提供api
addAnimationFrameCallback
removeCallback
addAnimationFrameCallback提供注册AnimationFrameCallback接口,当上层第一次向Provider注册时,添加默认的mFrameCallback接口,触发Choreographer callback机制。
removeCallback移除注册AnimationFrameCallback接口
由上所知,我们再看ValueAnimator恰恰实现了AnimationFrameCallback接口,内部调用getAnimationHandler(),基于AnimationHandler实现动画机制。
我们看下ValueAnimator的简单使用方法:
ValueAnimator animator = ValueAnimator.ofInt(500);
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
mView.setX(value);
}
});
animator.start();
发现主要做了两步动作:
1 配置动画参数
2 添加回调函数,收到值后执行动画的具体实现。
第二点我们可以猜测该回调必定在AnimationFrameCallback的doAnimationFrame中被执行。
我们顺藤摸瓜查看其逻辑,果然如此!
doAnimationFrame
animateBasedOnTime
animateValue
mUpdateListeners.get(i).onAnimationUpdate(this);
以上我们大致了解了ValueAnimator的整个动画实现机制,关于ProvertyValue,插值器, KeyFrame等的实现机制本文不再赘述。
源码分析总计:ValueAnimator很好的抽象了动画的逻辑机制,功能定义职责清晰,值得学习参考。
1 AnimationHandler封装Choreographer的相关接口,并抽象动画提供接口方便用户自定义扩展和测试 AnimationFrameCallbackProvider
2 AnimationHandler向上抽象动画调用接口AnimationFrameCallback,方便动画扩展。
3 ValueAnimator实现AnimationFrameCallback,单例调用AnimationHandler,实现doAnimationFrame 实现动画。
4 ValueAnimator专注动画的控制,实现start, stop, resume等接口