Android 动画之属性动画ValueAnimator

相关文章
Android 动画之视图动画
Android 动画之插值器
Android 动画之属性动画ValueAnimator
Android 动画之属性动画ObjectAnimator
Android 动画之集合动画AnimatorSet
Android 动画之布局动画
前面讲解过了视图动画(View Animation),可以知道ViewAnimation是跟View有关的,并且其视图效果的改变没有改变其view的属性。那么我们有没有什么别的方法来实现,视图的改变同时也实现对象本身的属性改变呢?那就是属性动画(Property Animation),Property Animation又分两种,分别为 ValueAnimator和ObjectAnimator。本文将要介绍的就是ValueAnimator。
Android 动画之属性动画ValueAnimator_第1张图片


XML中的用法

文件保存路径:

res/animator/filename.xml

语法:

"int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

例子:

res/animator/valueanimator.xml

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:valueFrom="-100"
    android:valueTo="100"
    android:valueType="intType" />

代码中的应用:

ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(ValueAnimatorActivity.this, R.animator.valueanimator);
animator.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer animatedValue = (Integer) animation.getAnimatedValue();
            view.scrollTo(animatedValue, 0);
        }
    });
animator.start();

代码中动态创建

ValueAnimator在代码中动态创建提供了3种方法,分别为ofInt、ofFloat、ofObject。前面两种很明显的可以看出其类型分别为int和float,第三种object就需要我们自己实现其对应的Evaluator,从而达到相应的目的。Evaluator将在后面讲到,这里我们看下ofInt的用法,代码如下:

ValueAnimator intAnimator = ValueAnimator.ofInt(300, -300);
intAnimator.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Integer animatedValue = (Integer) animation.getAnimatedValue();
        view.scrollTo(animatedValue, 0);
    }
});
intAnimator.setDuration(DURATION);
intAnimator.start();

从上面可以看去ofInt就是提供了从开始到结束的值,当然ofInt的参数是可变的,例如:ofInt(0, 100, 300, 100)表达就是从0到100,再到300,最后到100。通过监听addUpdateListener方法获取数据的实时变化,从而实现动画的效果。ValueAnimator还有其他一些参数可以设置,与ViewAnimation差不多,这里就不在介绍了。
ValueAnimator在代码中的使用,也是非常简单,容易上手的。它实现对ofInt中参数的变化,实时监听到达动画效果,当然我们不一定要做动画,也可以做一些别的需要数据变化的事情,这个根据实际需求而定。ofInt和ofFloat使用起来还是比较简单的,来看下ofObject怎么实现自定义属性的数据变化。我们先来看下ofObject的参数,如下:

ofObject(TypeEvaluator evaluator, Object... values)

从上可以看出ofObject多了一个TypeEvaluator类型,TypeEvaluator这个类型其实就是真正帮我们实现数据变化的地方。ofInt和ofFloat他们使用的是系统默认的IntEvaluator和FloatEvaluator,它们两的实现方法是一样的只是类型不同,所以这里只列出了IntEvaluator的源码。感兴趣的同学可以看下FloatEvaluator的源码其实就是类型不同。
IntEvaluator.java

public class IntEvaluator implements TypeEvaluator<Integer> {

    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(startInt + fraction * (endValue - startInt));
    }
}

可以看出IntEvaluator是实现了TypeEvaluator的类,evaluate就是要实现的方法,evaluate就是真正处理数据变化的地方。所以我们要想自定义自己的动画效果或者数据变化,我们就得实现TypeEvaluator,下面我实现了一个String类型的Evaluator类。
MyEvaluator

private class MyEvaluator implements TypeEvaluator<String> {
    @Override
    public String evaluate(float fraction, String startValue,
            String endValue) {
        String result = startValue+fraction;
        if (fraction == 0) {
            result = "start";
        } else if (fraction == 1) {
            result += endValue;
        }
        return result;
    }
}

在代码中的使用

ValueAnimator myAnimator = ValueAnimator.ofObject(new MyEvaluator(), "hello", "world");
myAnimator.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        String animatedValue = (String) animation.getAnimatedValue();
        textView.setText(animatedValue);
    }
});

myAnimator.setDuration(DURATION);
myAnimator.start();

从上可以看出我们实现了String类型数据的变化。


总结

ValueAnimator的使用还是非常简单的,最重要的事情,还是要动手,可以加深理解,这样用起来才会得心应手。


源代码

参考文章

Animation Resources
自定义控件三部曲之动画篇(四)——ValueAnimator基本使用
自定义控件三部曲之动画篇(五)——ValueAnimator高级进阶(一)
自定义控件三部曲之动画篇(六)——ValueAnimator高级进阶(二)

你可能感兴趣的:(android,animation)