android-学习属性动画源码(2)

属性动画的源码的确比较复杂,下面虽然将整个流程算是完整的走下来了,但是还是有很多的细节不明白。如果不知道怎么使用属性动画,请看上篇博客:https://blog.csdn.net/yuezheyue123/article/details/81630460
1.我们在activity中使用
这里写图片描述
2.进入静态方法ofFloat()
这里写图片描述
在ObjectAnimator的构造器中,设置执行动画的view和执行动画的属性名称
这里写图片描述
这里面有个重要的类 PropertyValuesHolder,这个类非常的重要,下面要经常遇见。
这里写图片描述
下面是重要的方法anim.setFloatValues(values)
这里写图片描述
查找PropertyValuesHolder,ofFloat()方法,一直查询到最后是调用了下面方法
这里写图片描述
这个方法调用父类方法后
这里写图片描述
调用KeyframeSet.ofFloat(values)方法,这个方法是将最初传进过来的可变参数,进行重新的封装,并且分为了两种情况,如果可变参数只传递了一个参数,那么就默认添加一个初始关键帧,并将传入的那个参数设置最后一个关键帧。如果已经传递了多个参数,那么就将各个参数设置成关键帧。
这里写图片描述
3.执行start()方法
最终是调用了ValueAnimator的start()方法,其中关键的方法有三个 animationHandler.addAnimationFrameCallback(….),startAnimation()和setCurrentPlayTime(0)。其中setCurrentPlayTime(0)和setCurrentFraction()里面调用的是同一方法。
这里写图片描述
这里写图片描述
先看animationHandler.addAnimationFrameCallback(….)。注意这里的postFrameCallback(mFrameCallback)的参数,非常重要,这里创建了一个回调。
这里写图片描述
这个就是参数创爱的回调方法,在后面非常重要,要进行使用。
这里写图片描述
其中getProvider()是MyFrameCallbackProvider()类的对象。
这里写图片描述
内层调用时添加了几层封装后到达下面的方法。这里是使用hanlder的进行消息的发送,android很多地方都是基于消息机制。
这里写图片描述
下面的handler具有三种情况。
这里写图片描述
首先执行的就是doScheduleCallback()方法。
这里写图片描述
这里写图片描述
调用handler的doFrame()方法
这里写图片描述
这里写图片描述
这里写图片描述
其中重要的方法就是doCallbacks()方法
这里写图片描述
这里写图片描述
这里写图片描述
重要的就是调用c.run(….)方法,点击进入后发现是这样情况。其中的action就是最初上面传递过过来的参数mFrameCallback。
这里写图片描述
就是最初创的对象,然后调用doAnimationFrame()方法
这里写图片描述
然后调用callback.doAnimationFrame()方法,这里的mAnimationCallbacks就是启动动画的个数。当你调用start()方法的时候就添加了一个callback.
这里写图片描述
因此要在ValueAnimator中找寻doAnimationFrame()方法。
这里写图片描述
这里写图片描述
最终调用的是animateBaseOnTime()方法
这里写图片描述
这里到达了一个重要的方法animateValue(),这里并没有有什么执行动画的代码,真正的执行的代码是在子类ObjectAnimator中。
这里写图片描述
子类中调用setAnimatedValue()方法,这里的mValues就是PropertyValuesHolder的对象
这里写图片描述
这里可以看到执行了invoke()方法,利用了反射。
这里写图片描述
然后查看startAnimation()方法,这里的重要方法initAnimation(),其实在子类中进行重写。
这里写图片描述
这里写图片描述
这里其实也是执行PropertyValuesHolder中的方法。这里其中有多个同名的方法,我感觉是调用了这个方法
这里写图片描述
这里写图片描述
calculateValue(0f);获取到第一帧。
nGetMultipleFloatMethod()获取到setXXX()方法。
最后调用setCurrentFraction()方法,还是调用animateValue()方法
这里写图片描述
通过差值器获取执行的百分比
这里写图片描述
最后在View中能找到这些方法
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yuezheyue123/article/details/81671185