android|Android 动画之属性动画ValueAnimator

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

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
"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 = https://www.it610.com/article/(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 = https://www.it610.com/article/(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 {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 { @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 = https://www.it610.com/article/(String) animation.getAnimatedValue(); textView.setText(animatedValue); } }); myAnimator.setDuration(DURATION); myAnimator.start();

从上可以看出我们实现了String类型数据的变化。
总结 ValueAnimator的使用还是非常简单的,最重要的事情,还是要动手,可以加深理解,这样用起来才会得心应手。
源代码 参考文章 【android|Android 动画之属性动画ValueAnimator】Animation Resources
自定义控件三部曲之动画篇(四)——ValueAnimator基本使用
自定义控件三部曲之动画篇(五)——ValueAnimator高级进阶(一)
自定义控件三部曲之动画篇(六)——ValueAnimator高级进阶(二)

    推荐阅读