Android 动画 插值器与估值器

为什么会有属性动画

1.补间动画与帧动画只能在具体view 做整体的动画 如textview button

2.有时候想对一个view的属性(如颜色,进度等)做动画效果,此时补间动画与帧动画并不能满足

3.补间动画与帧动画只改变的view 的视觉效果没有改变view的属性,动画效果单一

Interpolator 插值器 指定动画如何变化(加速,匀速,减速等),即初始值到结束值的变化规律

以下插值器实现了interpolator接口,Interpolator 接口则直接继承自 TimeInterpolator,而且并没有添加任何其它的方法

TimeInterpolator中只有一个方法  其中 input 是取值范围是 0 到 1,表示当前动画的进度(input只跟时间有关系)百分制进度

返回值 表示当前实际想要显示的数值进度

    float getInterpolation(float input);  

9中内置插值器

  • AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
  • AnticipateInterpolator 开始的时候向后然后向前甩
  • AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator 动画结束的时候弹起
  • CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator 在动画开始的地方快然后慢
  • LinearInterpolator 以常量速率改变
  • OvershootInterpolator 向前甩一定值后再回到原来位置

Evaluator:估值器,设置初始值到结束值过程中的具体数值

    public T evaluate(float fraction, T startValue, T endValue);

fraction =interpolator.getInterpolator()

Android 也提供了内置估值器

IntEvaluator

RectEvaluator

FloatEvaluator

...

 

Android 动画 插值器与估值器_第1张图片

 

补间动画与逐帧动画没有改变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

你可能感兴趣的:(android)