当前位置: 移动互联网学院 > Android开发 > 属性动画
属性动画 时间:2017-05-12     来源:移动互联网学院

属性动画是从一个状态过渡到另一个状态的动画,值得注意的一点就是,由于是从一个属性过渡到另一个属性,那么改变的不止是动画本身,作用对象的属性也是变化的,那么可以实现各种各样的动画。另外一个增强的地方在于,属性动画可以作用于任何对象,这让属性动画的应用变得非常丰富。

但是属性动画是Android3.0之后才加入的,从API11之后集成,所以要在之前的Android版本上使用可能需要手动添加第三方库,不过相对于其优点,在开发中还是更加建议使用属性动画。

属性动画可以使用AnimatorInflater来像视图动画那样通过xml文件来控制动画,但是属性动画更加建议使用动态代码来进行控制,因为这种控制方法可变性以及易用性上都有明显的优势。因此本文对属性动画的讲解都是通过动态控制来实现的。感兴趣的读者可自行查阅API11之后的文档来了解AnimatorInflater这种动画加载模式。

属性动画包含很多常用类,本文重点介绍ValueAnimator、ObjectAnimator和AnimatorSet类。并且后会介绍属性动画的监听。

1  ValueAnimator

ValueAnimator类用于计算动画数值,其本身并不会对控件做任何操作。如果要进行实际的动画操作需要主动监听ValueAnimator的动画过程来对控件进行操作,关于动画监听的内容,将于14.6.4节中进行介绍。

ValueAnimator有很多方法,下面举例说明一些常用方法:

(1) public static ValueAnimator ofInt(int... values)

通过此方法可以返回一个ValueAnimator对象,其动画变化数值为参数的可变长数值变化,此方法接受的数值为int型。同样有ofFloat等方法可以接受其他类型的数值变化。

(2) setInterpolator(TimeInterpolator value)

设置动画速率。系统预置很多,例如LinearInterpolator等。

(3) setEvaluator(TypeEvaluator value)

设置一个动画速率计算器,根据不同的动画速率通过不同的计算器TypeEvaluator内的计算方式来计算ofInt等方法设置的不同类型的数值。TypeEvaluator有几种实现类型,包括IntEvaluator、FloatEvaluator和AagbEvaluator。因为TypeEvaluator是一个接口,除了上述几种已经预置的类型外也可以自己实现TypeEvaluator来自定义计算器对象。

(4) setDuration(long duration)

设置动画持续时间。

(5) setRepeatCount(int value)

设置动画重复的次数。默认值为0,表示重复次数为0。当数值为-1时,表示无限循环。

(6) setRepeatMode(int value)

设置动画重复模式。有两个数值ValueAnimator.RESTART和ValueAnimator.REVERSE,分别表示连续重复模式和反向重复模式。

(7) setStartDelay(long startDelay)

设置动画开始之前的延时时长。

2  ObjectAnimator

ObjectAnimator是ValueAnimator的子类,省去了自己去配置动画的麻烦,在设置动画的方法中可以直接送入控件对象来进行动画的实现。主要的区别在于获得ObjectAnimator对象的方法输入的参数要比ValueAnimator丰富的多。例如int类型的方法,如下:

public static ObjectAnimator ofInt(Object target, String propertyName, int... values)

可以看出,ofInt方法的第一个参数为送入的控件对象,第二个参数为属性动画作用的属性的名称,包括:scaleX、scaleY、rotationX、rotationY、translationX、translationY、alpha等效果。

下面通过代码来展示:

// 将mText对象设置平移X轴动画,坐标分别变换为100、300、200、500

ObjectAnimator tranX = ObjectAnimator.ofInt(mText,"translationX", 100, 300, 200, 500);

// 设置动画持续时长为3000毫秒

tranX.setDuration(3000);

// 设置动画重复次数为1次

tranX.setRepeatCount(1);

// 设置重复模式为连续重复模式

tranX.setRepeatMode(ObjectAnimator.RESTART);

// 设置动画延时时间为1000毫秒

tranX.setStartDelay(1000);

// 开始动画

tranX.start();

3  AnimationSet

AnimationSet为动画的集合,使用起来非常简单。方法直接看代码即可理解,如下:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(mText, "scaleX", 1.0f, 0.5f, 1.0f);

ObjectAnimator animator2 = ObjectAnimator.ofFloat(mText, "scaleY", 1.0f, 0.5f, 1.0f);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(mText, "rotationX", 0.0f, 180.0f, 0.0f);

ObjectAnimator animator4 = ObjectAnimator.ofFloat(mText, "alpha", 100.0f, 180.0f, 200.0f);

AnimatorSet set = new AnimatorSet();

set.setDuration(5000);

set.setInterpolator(new AccelerateDecelerateInterpolator());

set.playTogether(animator1, animator2, animator3, animator4);

set.start();

当然,AnimationSet也可以通过xml文件来实现,在此就不多说了,开篇的时候曾说过,对于属性动画,还是建议使用代码来动态控制的。

4  属性动画监听器

前文中提到属性动画存在监听器,本节来讲解其使用。监听器分为两种AnimatorListener和AnimatorUpdateListener。

AnimatorListener有四个回调方法:

(1) onAnimationStart(Animator animation)

动画开始时,回调此方法。

(2) onAnimationRepeat(Animator animation)

动画重复执行时,回调此方法。

(3) onAnimationEnd(Animator animation)

动画结束时,回调此方法。

(4) onAnimationCancel(Animator animation)

动画取消时,回调此方法。

AnimatorUpdateListener只有一个回调方法:onAnimationUpdate(ValueAnimator animation),当动画每播放一帧的时候,就回调一次。

动画监听器的使用如下:

ValueAnimator animator = ValueAnimator.ofInt(0, 400);

animator.setStartDelay(1000);

animator.addListener(new AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

Log.d("Jason", "动画开始的回调");

}

@Override

public void onAnimationRepeat(Animator animation) {

Log.d("Jason", "动画重复的回调");

}

@Override

public void onAnimationEnd(Animator animation) {

Log.d("Jason", "动画结束的回调");

}

@Override

public void onAnimationCancel(Animator animation) {

Log.d("Jason", "动画取消的回调");

}

});              

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                 

@Override

public void onAnimationUpdate(ValueAnimator animation) {

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

Log.d("Jason", "curValue: " + curValue);

}

});

animator.start();          

通过属性动画监听器,可以在相关的回调方法中手动去给控件做一些位置等属性的变换,搭配前文中提到的ValueAnimator,也可以自己实现相关的动画效果。实际上ObjectAnimator也是如此封装的。