Android|极简源码之Android ObjectAnimator实现原理

相对于View动画,属性动画有很多好处,比如:可以对任何对象操作,解决动画后控件点击区域问题等等。
我们以平移一个View展开来说:
Android|极简源码之Android ObjectAnimator实现原理
文章图片

调用ObjectAnimator.ofFloat时:
Android|极简源码之Android ObjectAnimator实现原理
文章图片

创建了一个ObjectAnimator对象,然后将传入的属性值保存下来,我们先看下anim.setFloatValues(values)里面具体干了什么
Android|极简源码之Android ObjectAnimator实现原理
文章图片

PropertyValuesHolder.ofFloat 里面会创建一个FloatPropertyValuesHolder
Android|极简源码之Android ObjectAnimator实现原理
文章图片

Android|极简源码之Android ObjectAnimator实现原理
文章图片

看它的成员变量命名,不难猜到,就是利用PropertyValuesHolder来修改传入对象的属性的,具体实现是通过反射机制,通过拼接传入的属性名来反射到对应属性的set/get方法,感兴趣的可以看下完整代码,这里就不阐述了,以免脱离主线,陷入源码无法自拔。
然后我们接着看ValueAnimator.setValues
Android|极简源码之Android ObjectAnimator实现原理
文章图片

PropertyValuesHolder存到HashMap中,key为propertyName, 以便取出对应属性的PropertyValuesHolder
然后我们返回来看下ObjectAnimator构造方法里面干了什么
Android|极简源码之Android ObjectAnimator实现原理
文章图片

就是初始化了操作对象,操作对象的属性名
【Android|极简源码之Android ObjectAnimator实现原理】到现在为止,ObjectAnimator的准备工作都做好了,然后就是调用start方法开始执行动画了
Android|极简源码之Android ObjectAnimator实现原理
文章图片

AnimationHandler这个类的作用我们稍后揭晓,我们先看下父类,也就是ValueAnimator的start实现
Android|极简源码之Android ObjectAnimator实现原理
文章图片

Android|极简源码之Android ObjectAnimator实现原理
文章图片

首先会检测下执行start的线程是否属于Looper线程(这也暗示了,是消息循环来驱动更新属性值,从而产生动画效果的),然后就是一堆变量的初始化,随后,会调用addAnimationCallback
Android|极简源码之Android ObjectAnimator实现原理
文章图片

Android|极简源码之Android ObjectAnimator实现原理
文章图片

,再次看到了AnimationHandler,这个类是干什么用的呢?看类名,貌似是动画的处理者,我们看下类的实现
Android|极简源码之Android ObjectAnimator实现原理
文章图片

有个staticThreadLocal,负责存放对应Looper线程AnimationHandler,以便对应线程获取
Android|极简源码之Android ObjectAnimator实现原理
文章图片

Android|极简源码之Android ObjectAnimator实现原理
文章图片

会维护一个Choreographer对象,看Choreographer类的实现,可以发现Looper,Handler,Message的痕迹,也验证了上文的推测:消息循环来驱动更新属性值。具体的实现这里就不阐述了。
AnimationHandler的作用大致就是:建立与Choreographer的联系,从而接收到系统的帧绘制消息,然后转发回ValueAnimator,然后再通过PropertyValueHolder给对象设置新属性值,然后产生动画效果。
驱动更新的位置找到了,那在什么位置更新对象的属性呢?
Android|极简源码之Android ObjectAnimator实现原理
文章图片

Android|极简源码之Android ObjectAnimator实现原理
文章图片

我们可以看到,计算当前时间点属性值的任务也是PropertyValuesHolder完成的, ValueAnimator.animateValue负责调用计算当前属性值方法,然后ObjectAnimator自动将新属性值设置给当前对象。
若有错误,欢迎指正!

    推荐阅读