属性动画源码

实现方法:利用属性动画,scaleX和scaleY,alpha,INTERPOLATOR来实现的动画效果。
补间动画的缺陷:
补间动画只能够实现旋转,平移,淡入淡出,缩放出这四种动画操作。属性动画可以针对任何属性进行操作。
补间动画只可以对UI组件进行动画操作,而属性动画可以针对任何对象进行操作。
补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。
Android 3.0版本开始:属性动画,只需要指定执行哪种动画,动画的持续时间,动画的初始值和结束值。
ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法。
ValueAnimator:是ObjectAnimator的父类
ObjectAnimator:
AnimatorSet:组合动画
使用XML编写动画
设计属性动画的思路:拿到设置的动画的起始值,结束值,动画时间等参数后,开启一个定时器,去执行一个任务,在任务中根据插值器计算fraction,交给Evaluator,得到属性当前应该设置的值,然后根据反射设置动画目标的指定属性。
属性动画原理:拿到设置的动画的起始值,结束值,动画时间等参数后,开启一个定时器,去执行一个任务,在任务中根据插值器计算fraction,交给Evaluator,得到属性当前应该设置的值,然后根据反射设置动画目标的指定属性。
插值器:
AccelerateInterpolator:fraction指数增长,
LinearInterpolator:fraction线性增长。
TypeEvaluator:告诉动画系统如何从初始值过度到结束值,evaluate()方法。evaluate()方法当中传入了三个参数,第一个参数fraction非常重要,这个参数用于表示动画的完成度的,fraction是用插值器计算出来的,我们应该根据它来计算当前动画的值应该是多少,第二第三个参数分别表示动画的初始值和结束值,用结束值减去初始值,算出它们之间的差值,然后乘以fraction这个系数,再加上初始值,那么就得到当前动画的值了。
Interpolator: fraction,其实是插值器算出来的。比如线性插值器:fraction 值就是(currentTime - mStartTime) / mDuration,动画的运行时间/总设置时间。
反射调用:
源码解释:
ofInt:
(1)ofInt中实例化了一个ObjectAnimator对象,然后设置了target,PropertyName,values(PropertyValuesHolder)

(2)然后分别在setInterpolator,setDuration设置了Interpolator和duration。

(3)其中setEvaluator是给PropertyValuesHolder,以及keyframeSet设置估值算法。

(4)PropertyValueHolder实际上是IntPropertyValueHolder类型对象,包含PropertyName,valueType,keyframeSet .

start:

更新动画各种状态,然后初步计算fraction为(currentTime - mStartTime) / mDuration;然后将这个fraction交给我们的插值器计算后得到新的fraction,再将新的fraction交给我们的Evaluator,Evaluator根据开始、结束、fraction得到当前属性(动画作用的属性)应该的值,最后调用反射进行设置;

你可能感兴趣的:(属性动画源码)