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