Android ValueAnimator、ObjectAnimator与插值器interpolator、估值器Evaluator

##.综合介绍

1.插值器interpolator

    动画的插值器用于控制动画完成度相对于时间的变化规律,使其符合设定的数学函数。(不过大部分情况下,我们主要是选用系统预设的几种插值器来控制速度变化。)

    完成度以float类型返回,1.0代表完成100%进度。通过给动画设置插值器,可以控制控制对象的运动轨迹。(上面完成度的值可以超过1.0,例如控制运动对象超过终点位置再返回终点,完成度就先超过1.0再变回1.0)

常用的插值器:

以下内容摘自Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书

Interpolator对象

功能作用

属性讲解

AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator

先加速再减速

AccelerateInterpolator @android:anim/accelerate_interpolator

加速

android:factor 浮点值,加速速率,默认为1; android:tension浮点值,起始点后退的张力、拉力数,默认为2

AnticipateInterpolator @android:anim/anticipate_interpolator

先回退一小步然后加速前进

AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator

先回退一小步然后加速前进,超出终点一小步后再回到终点

android:tension 同上; android:extraTension 浮点值,拉力的倍数,默认为1.5(2 * 1.5)

BounceInterpolator @android:anim/bounce_interpolator

最后阶段弹球效果

CycleInterpolator @android:anim/cycle_interpolator

周期运动

android:cycles整数值,循环的个数,默认为1

DecelerateInterpolator @android:anim/decelerate_interpolator

减速

android:factor 浮点值,减速的速率,默认为1

LinearInterpolator @android:anim/linear_interpolator

匀速

OvershootInterpolator @android:anim/overshoot_interpolator

快速到达终点并超出一小步最后回到终点

tension浮点值,超出终点后的张力、拉力,默认为2

2.ValueAnimator

    内部有一个估值器Evaluator,作用是按照估值器中数学函数(默认是匀速变化),从设定的初始值变化到设定的结束值,在回调监听接口中,不断返回中间的变化值。开发者拿到这个值,就可以按照这个值来设定View的属性值,从而实现该View的动画效果。

    实际上,ValueAnimator不光可以用来实现动画,完全可以只当做一个数学函数变化过程,来实现其它渐变的逻辑。

    ValueAnimator继承自Animator,可以像设置动画一样设置其它很多特性,比如延迟执行、循环执行等。

    ValueAnimator估值器的值,实际上是依赖于其插值器的计算结果,若使用默认估值器,则其估值的变化规律与插值器的变化规律完全相同。通过设置不同的插值器,其实就可以控制估值的变化规律。

3.ObjectAnimator

    继承自ValueAnimator,估值过程与ValueAnimator相同,新增变化在API中可以直接传入指定的View和要改变的属性值,这样就不用开发者自己在估值回调接口中再自己写代码改变View属性值。一般用来实现属性动画。

##.ValueAnimator简单代码示例

//估值器可以不传入,不传入的话会使用默认估值器,做匀速变化

ValueAnimator valueAnimator = ValueAnimator.ofInt([估值器],【开始值】, 【结束值】)

        .setDuration(time);

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override

    public void onAnimationUpdate(ValueAnimator animation) {

        int value = (int)animation.getAnimatedValue();

        mRvFl.scrollTo(0, value);

    }

});

valueAnimator.start();

##.ValueAnimator自定义估值器

估值器,以IntEvaluator为例,每次监听回调时都会调用其evaluate()方法,返回对应的值。所以可以自己写个继承类,然后在创建的时候设置给ValueAnimator。

    估值器的计算逻辑,其实就是根据当前的完成比例值fraction来设计数学函数进行计算,这个fraction是由ValueAnimator的插值器计算出的。所以很多需求,其实不需要自定义估值器,只需要调整所用的插值器,这样fraction的计算逻辑变了,估值的件计算逻辑也同样改变了。(因为SDK本身就提供了多种多样变化轨迹的插值器,但并没有提供多种多样变化轨迹的估值器。)

public class IntEvaluator implements TypeEvaluator<Integer> {

    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {

        int startInt = startValue;

        return (int)(startInt + fraction * (endValue - startInt));

    }

}

其中fraction为动画的完成度,startValue为初始值,endValue为结束值,返回值为当前动画的数值。

原理:endValue - startInt算出插值再乘以完成度就得到了当前改变的增量,再加上startInt 即为当前的动画数值。

##.补充

1.ValueAnimator.onObject()操作的对象是Object值的变化,它没有默认估值器。需要自定义估值器,在估值器里定义操作的是什么对象,并且在估值接口实现估值的计算逻辑。

参考剪藏:

Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书

 Android 动画:插值器与估值器(含详细实例教学) - 简书

(声明:部分图片获取自网络,这里只是用于学习分享,侵删!)

猜你喜欢

转载自blog.csdn.net/u013914309/article/details/124599665