为什么会有属性动画
1.补间动画与帧动画只能在具体view 做整体的动画 如textview button
2.有时候想对一个view的属性(如颜色,进度等)做动画效果,此时补间动画与帧动画并不能满足
3.补间动画与帧动画只改变的view 的视觉效果没有改变view的属性,动画效果单一
Interpolator 插值器 指定动画如何变化(加速,匀速,减速等),即初始值到结束值的变化规律
以下插值器实现了interpolator接口,Interpolator 接口则直接继承自 TimeInterpolator,而且并没有添加任何其它的方法
TimeInterpolator中只有一个方法 其中 input 是取值范围是 0 到 1,表示当前动画的进度(input只跟时间有关系)百分制进度
返回值 表示当前实际想要显示的数值进度
float getInterpolation(float input);
9中内置插值器
public T evaluate(float fraction, T startValue, T endValue);
fraction =interpolator.getInterpolator()
Android 也提供了内置估值器
IntEvaluator
RectEvaluator
FloatEvaluator
...
补间动画与逐帧动画没有改变view 位置的原因
View.startAnimation()
public void startAnimation(Animation animation) {
animation.setStartTime(Animation.START_ON_FIRST_FRAME);
setAnimation(animation);
invalidateParentCaches();
invalidate(true);
}
view 的绘制流程中调用invalidate()时,若View的大小和位置没有发生改变的时候只是会重新绘制。
上面的代码我们可以看出并没有更改与View相关的坐标信息。只是在draw方法中进行了处理。
属性动画改变位置的原因
ValueAnimation.startAnimation(),最终会调用 getPropertyFunction()方来获取相应的方法,
通过这里可以看出我们设置属性时是通过View.setxxx()方法来设置的。
ValueAnimation.doAnimationFrame()----->animateValue()
回到animateValue()方法中首先是通过插值器获取前属性改变的百分比,然后在将当前属性改变的百分比传给估值器进行计算并返回当前属性具体的改变量。
最后的两种动画的位置分析参考了 https://www.jianshu.com/p/46119168b82a