ValueAnimator
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.start();
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 0f);
anim.setDuration(5000);
anim.start();
<span style="color:#333333;"></span><pre name="code" class="java"><pre name="code" class="java">backGroundColorAutoChangeAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// TODO Auto-generated method stub
//动画开始时执行
}
@Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
//重复动画时执行
}
@Override
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
//动画结束执行
}
@Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
//取消动画时执行
}
});
backGroundColorAutoChangeAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
///动画更新时执行
}
});
当然也许你并不需要小数位数的动画过渡,可能你只是希望将一个整数值从0平滑地过渡到100,那么也很简单,只需要调用ValueAnimator的ofInt()方法就可以了,如下所示:
ValueAnimator anim = ValueAnimator.ofInt(0, 100);
alueAnimator当中最常用的应该就是ofFloat()和ofInt()这两个方法了,另外还有一个ofObject()方法,
ObjectAnimator
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,这里如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:
ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(mPaint, "color",
Color.WHITE, Color.BLACK);
第一个参数是执行动画的对象,通常是View动画集合 set
独立的动画能够实现的视觉效果毕竟是相当有限的,因此将多个动画组合到一起播放就显得尤为重要。幸运的是,Android团队在设计属性动画的时候也充分考虑到了组合动画的功能,因此提供了一套非常丰富的API来让我们将多个动画组合到一起。
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行
ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(mPaint, "color",
Color.WHITE, Color.BLACK);
// backGroundColorAutoChangeAnimator.setDuration(10000);
backGroundColorAutoChangeAnimator.setEvaluator(new ArgbEvaluator());
backGroundColorAutoChangeAnimator.setRepeatCount(ValueAnimator.INFINITE);
backGroundColorAutoChangeAnimator.setRepeatMode(ValueAnimator.REVERSE);
// backGroundColorAutoChangeAnimator.start();
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(s1, backGroundColorAutoChangeAnimator);// 并行
animatorSet.setDuration(5000);
// animatorSet.play(animator).with(backGroundColorAutoChangeAnimator);
animatorSet.start();
playTogether();和给定的动画同事执行,可以是一组动画。对应的还有一个顺序执行的方法: