android 动画之 属性动画propertyAnimator(一)

来源:互联网 发布:java有趣的程序 编辑:程序博客网 时间:2024/06/06 14:05

ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
但是ValueAnimator的用法却一点都不复杂,我们先从最简单的功能看起吧,比如说想要将一个值从0平滑过渡到1,时长300毫秒,就可以这样写:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.start();  
这样就能从0耗时300毫秒后平滑过渡到了1,这是很简单的例子,当然我们还可以传入多个参数,那么,除了第一个是起始位置,最后一个是结束位置外,中间的其他数据都是过渡数据,例如
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 0f);  
anim.setDuration(5000);  
anim.start();  
这样就是先从0过渡到5,再从5过渡到3,然后在从3过渡到0;耗时5000ms;
还可以对ValueAnimator添加监听器:
<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()方法,
除此之外,我们还可以调用setStartDelay()方法来设置动画延迟播放的时间,调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思。

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
第二个参数是动画变化的属性,如:textSize,textColor,alpha...通常她的取值是由第一个参数决定,只有当第一个参数中有对应的getter和setter方法后才可以
第三四参数是属性的取值范围,可以不止两个值

动画集合 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();和给定的动画同事执行,可以是一组动画。对应的还有一个顺序执行的方法:
animatorSet.playSequentially();于给定的动画一次执行。


1 0