android 动画 属性动画 ValueAnimator

属性动画2  Property Animation

ValueAnimator(差值动画)

单纯从字面上理解的话ObjectAnimator作用于某个实际的对象,而ValueAnimatorObjectAnimator的父类,它继承自抽象类Animator,它作用于一个值,将其由一个值变化为另外一个值,然后根据值的变化,按照一定的规则,动态修改View的属性,比如View的位置、透明度、旋转角度、大小等,即可完成了动画的效果。

 

/*
    这里通过ofFloat()方法构造一个ValueAnimator实例,除此之外还提供了
    其他函数ofInt()ofObject()ofPropertyValuesHolder()函数,
    api 21之后又提供了ofArgb(),每个函数都是可以传入多个改变值。
 */
public void initAnim() {
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
    valueAnimator.setDuration(2000);
    valueAnimator.setInterpolator(new LinearInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float money = (float) animation.getAnimatedValue();
            mTextView.setText(String.format("%.2f", money));
        }
    });
    valueAnimator.start();
}

 

Interpolator

//如何自定义一个插值器?举例:我们实现一个先减速后加速插值器,代码如下
public class DecelerateAccelerateInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float input) {
        float result;
        if (input <= 0.5f) {
            result = (float) (Math.sin(Math.PI * input)) / 2.0f;
        } else {
            result = (float) (2 - Math.sin(Math.PI * input)) / 2.0f;
        }
        return result;
    }
}

 

TypeEvaluator

//TypeEvaluator(估值器)
/*
TypeEvaluator用于根据当前属性改变的百分比来计算改变后的属性值,系统提供了如下几种估值器
IntEvaluator 针对整型属性
IntArrayEvaluator 针对整型属性集合
FloatEvaluator 针对浮点型属性
FloatArrayEvaluator 针对浮点型属性集合
ArgbEvaluator  针对Color属性
RectEvaluator 针对Rect属性
PointFEvaluator 针对PointF属性
*/

 

// 接口提供了evaluate(float fraction, T startValue, T endValue);
// 动画在运行过程中Interpolator自动计算出动画运行的百分比fraction// 然后TypeEvaluator根据fraction计算出当前动画的属性值。
public class FloatEvaluator implements TypeEvaluator<Number> {
    public Float evaluate(float fraction, Number startValue, Number endValue) {
        float startFloat = startValue.floatValue();
        return startFloat + fraction * (endValue.floatValue() - startFloat);
    }
}

 

自定义TypeEvaLuator

//如何自定义TypeEvaLuator?比如我们要实现一个钱的增加,字体颜色越红的动画,
// 我们现在都知道可以使用ofArgb(),但是ofArgb()需要api 21以上才能使用,
// 所以需要我们自定义一个ArgbEvaLuator,这里为了演示自定义
// TypeEvaluator直接把api 21中提供的ArgbEvaluator源代码拿来使用
public class TextArgbEvaluator implements TypeEvaluator {

    public Object evaluate(float fraction, Object startValue, Object endValue) {
        int startInt = (Integer) startValue;
        int startA = (startInt >> 24) & 0xff;
        int startR = (startInt >> 16) & 0xff;
        int startG = (startInt >> 8) & 0xff;
        int startB = startInt & 0xff;

        int endInt = (Integer) endValue;
        int endA = (endInt >> 24) & 0xff;
        int endR = (endInt >> 16) & 0xff;
        int endG = (endInt >> 8) & 0xff;
        int endB = endInt & 0xff;

        return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |
                (int) ((startR + (int) (fraction * (endR - startR))) << 16) |
                (int) ((startG + (int) (fraction * (endG - startG))) << 8) |
                (int) ((startB + (int) (fraction * (endB - startB))));
    }
}

 

调用方式

//调用方式:
public void ss() {
    AnimatorSet animatorSet = new AnimatorSet();
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float money = (float) animation.getAnimatedValue();
            Log.e("Interpolator", "money---->" + money);
            mTextView.setText(String.format("%.2f", money));
        }
    });

    int startColor = Color.parseColor("#FCA3AB");
    int endColor = Color.parseColor("#FB0435");
    ValueAnimator colorAnimator = ValueAnimator.ofObject(new TextArgbEvaluator(), startColor, endColor);
    colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int color = (int) animation.getAnimatedValue();
            Log.e("Interpolator", "color---->" + color);
            mTextView.setTextColor(color);
        }
    });

    animatorSet.playTogether(valueAnimator, colorAnimator);
    animatorSet.setDuration(5000);
    animatorSet.setInterpolator(new LinearInterpolator());
    animatorSet.start();
}

 

猜你喜欢

转载自blog.csdn.net/l331258747/article/details/70858290