Android提供了几种动画类型:View Animation(补间动画) 、Drawable Animation (帧动画)、Property Animation (属性动画)。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如:你希望View有一个颜色的切换动画;你 希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的 原因。
新引入的属性动画机制已经不再是针对于View来设计的了,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作,同时也不再只是一 种视觉上的动画效果了。它实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。
一、相关API
ObjectAnimator 动画的执行类
ValueAnimator 动画的执行类
AnimatorSet 用于控制一组动画的执行
setDuration() 设置动画时间
start() 开始动画
cancel() 停止动画在当前位置
end() 动画直接到终状态
setRepeatMode 设置动画重复方式
setRepeatCount设置动画重复次数
二、ObjectAnimator使用
ObjectAnimator是属性动画框架中重要的实现类,创建一个ObjectAnimator只需要通过它的静态方法直接返回一个ObjectAnimator对象。静态方 法如下:
ofFloat(Object target, String propertyName, float... values);
ofInt(Object target, String propertyName, int... values);
ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values);
这里先关注ofFloat、ofint,方法中有三个参数:
Target:指定执行动画的view
propertyName:指定动画的属性
values:可变数组参数,指定属性对应的属性值
如下所示,给imageview设置渐变的动画。
ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "alpha", 1.0f, 0.0f);
// 设置时间
animator. setDuration(1000);
// 开始动画
animator.start();
下面列举出一些可以直接使用的属性:
translationX、translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。
rotation、rotationX、rotationY:这三个属性控制着View对象围绕它的支点进行2D和3D的旋转。
scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。
alpha:它表示View对象的alpha透明度。
二、ValueAnimator使用
ValueAnimator是整个属性动画中核心的一个类,前面介绍的ObjectAnimator也是继承自ValueAnimator。
ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。通常情 况下,在ValueAnimator的AnimatorUpdateListener中监听数值的变化,从而完成动画的切换。
如下所示,利用ValueAnimator给imageview设置渐变的动画。
ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f);
animator.setDuration(1000);
animator.start();
// 反复循环,REATART从头开始循环
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setRepeatCount(ValueAnimator.INFINITE);// 无限循环
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
imageView.setAlpha((Float)animation.getAnimatedValue());
}
});
三、AnimatorSet使用
AnimatorSet这个类来帮我们实现组合属性动画的效果。AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象 (ObjectAnimator或者ValueAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包含了以下四个方法:
after(Animator anim) : 将现有动画插入到传入的动画之后执行。
after(long delay):将现有的动画延迟指定的毫秒后执行。
before(Animator anim):将现有的动画插入到传入的动画之前执行。
with(Animator anim):将现有的动画和传入的动画同时执行。
// 移动动画
ObjectAnimator transAnimator = ObjectAnimator.ofFloat(mTextView, "translationX", -500f, 300f);
// 旋转动画
ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f);
// 淡入淡出
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mTextView, "alpha", 1f, 0f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(rotationAnimator).with(alphaAnimator).after(transAnimator);
animatorSet.setDuration(5000);
animatorSet.start();
四、Animator监听器
对于动画,一般都是一些辅助效果,比喻说一个view动画结束后里一个view开始动画,这就需要对动画过程进行监听。通过实现AnimatorListener 接口即可对动画的Start、End、Repeat、Cancel四个状态监听。
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.e("tag", "onAnimationStart");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.e("tag", "onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.e("tag", "onAnimationCancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.e("tag", "onAnimationRepeat");
}
})