极简源码之Android ObjectAnimator实现原理

本文介绍了属性动画相对于View动画的好处,以平移View为例展开。详细阐述了属性动画的实现过程,包括创建对象、利用反射机制修改属性、初始化操作对象和属性名等准备工作,还说明了动画通过消息循环驱动更新属性值,以及属性值的计算和设置方式。

相对于View动画,属性动画有很多好处,比如:可以对任何对象操作,解决动画后控件点击区域问题等等。

我们以平移一个View展开来说:
在这里插入图片描述
调用ObjectAnimator.ofFloat时:
在这里插入图片描述
创建了一个ObjectAnimator对象,然后将传入的属性值保存下来,我们先看下anim.setFloatValues(values)里面具体干了什么
在这里插入图片描述

PropertyValuesHolder.ofFloat 里面会创建一个FloatPropertyValuesHolder
在这里插入图片描述
在这里插入图片描述
看它的成员变量命名,不难猜到,就是利用PropertyValuesHolder来修改传入对象的属性的,具体实现是通过反射机制,通过拼接传入的属性名来反射到对应属性的set/get方法,感兴趣的可以看下完整代码,这里就不阐述了,以免脱离主线,陷入源码无法自拔。

然后我们接着看ValueAnimator.setValues
在这里插入图片描述
PropertyValuesHolder存到HashMap中,key为propertyName, 以便取出对应属性的PropertyValuesHolder

然后我们返回来看下ObjectAnimator构造方法里面干了什么
在这里插入图片描述
就是初始化了操作对象,操作对象的属性名

到现在为止,ObjectAnimator的准备工作都做好了,然后就是调用start方法开始执行动画了
在这里插入图片描述
AnimationHandler这个类的作用我们稍后揭晓,我们先看下父类,也就是ValueAnimator的start实现
在这里插入图片描述
在这里插入图片描述
首先会检测下执行start的线程是否属于Looper线程(这也暗示了,是消息循环来驱动更新属性值,从而产生动画效果的),然后就是一堆变量的初始化,随后,会调用addAnimationCallback
在这里插入图片描述
在这里插入图片描述
,再次看到了AnimationHandler,这个类是干什么用的呢?看类名,貌似是动画的处理者,我们看下类的实现
在这里插入图片描述
有个staticThreadLocal,负责存放对应Looper线程AnimationHandler,以便对应线程获取
在这里插入图片描述
在这里插入图片描述
会维护一个Choreographer对象,看Choreographer类的实现,可以发现Looper,Handler,Message的痕迹,也验证了上文的推测:消息循环来驱动更新属性值。具体的实现这里就不阐述了。
AnimationHandler的作用大致就是:建立与Choreographer的联系,从而接收到系统的帧绘制消息,然后转发回ValueAnimator,然后再通过PropertyValueHolder给对象设置新属性值,然后产生动画效果。

驱动更新的位置找到了,那在什么位置更新对象的属性呢?
在这里插入图片描述
在这里插入图片描述
我们可以看到,计算当前时间点属性值的任务也是PropertyValuesHolder完成的, ValueAnimator.animateValue负责调用计算当前属性值方法,然后ObjectAnimator自动将新属性值设置给当前对象。

若有错误,欢迎指正!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值