在app里面添加炫酷的动画效果,出来的效果是件非常棒的,所以,接下来我要介绍的就是Android的动画之一属性动画(Property Animation),为什么说是之一呢?因为还有补间动画和帧动画,不过我不会介绍的(感兴趣的可以百度去),因为,,因为有属性动画就够了,完全可以实现所有的效果。
Duration动画的持续时间,默认300ms。
Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的了,定义动画的变化率。
Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
相关的类:
ObjectAnimator 动画的执行类,后面详细介绍
ValueAnimator 动画的执行类,后面详细介绍
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
AnimatorInflater 用户加载属性动画的xml文件
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
ValueAnimator:属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡。
它的用法也超级简单,代码:
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 500f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float deltaY = (float)animation.getAnimatedValue();
iv.setTranslationY(deltaY);
}
});
//默认duration是3000毫秒
valueAnimator.setDuration(3000);
valueAnimator.start();
上面的代码意思其实就是:我们通过构造函数指定了动画的起始值为0,终止值为500,动画的默认持续时间是3000毫秒,我们通过setDuration()方法设置为3000毫秒。该动画会在3秒内,将值从0到500动画渐变。ValueAnimator提供了一个addUpdateListener方法,可以通过该方法向其添加AnimatorUpdateListener类型的监听器。AnimatorUpdateListener有一个onAnimationUpdate方法,ValueAnimator会每隔一定时间(默认间隔10ms)计算属性的值,每当计算的时候就会回调onAnimationUpdate方法。效果如下:
ObjectAnimator:继承自ValueAnimator,是可以直接对任意对象的任意属性进行动画操作的。
我们常常用到的类就是ObjectAnimator,它既然是继承自ValueAnimator,所以ValueAnimator的方法他都可以使用的。要让属性动画渐变式地更改对象中某个属性的值,可分两步操作:第一步,动画需要计算出某一时刻属性值应该是多少;第二步,需要将计算出的属性值赋值给动画的属性。ValueAnimator只实现了第一步,也就是说ValueAnimator只负责以动画的形式不断计算不同时刻的属性值,但需要我们开发者自己写代码在动画监听器AnimatorUpdateListener的onAnimationUpdate方法中将计算出的值通过对象的setXXX等方法更新对象的属性值。
1.ObjectAnimator平移动画的实现:
float value1 = 0f;
float value2 = 500f;
final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationY", value1, value2);
objectAnimator.setDuration(3000);
objectAnimator.start();
这段代码实现的效果和上图是一样的,是不是更简单了,由此可见,ObjectAnimator比ValueAnimator更进一步,其会自动调用对象的setXXX方法更新对象中的属性值。
2.ObjectAnimator透明动画的实现:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0,1f);
objectAnimator.setDuration(3000);
objectAnimator.start();
这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个iv。第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变iv的不透明度,因此这里传入”alpha”。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画,效果如下图所示:
3.ObjectAnimator缩放动画的实现:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 3f,1f);
objectAnimator.setDuration(3000);
objectAnimator.start();
4.ObjectAnimator旋转动画的实现:
ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);
animator.setDuration(5000);
animator.start();
5.组合动画:实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
playTogether(Animator anim,Animator anim,…);将传入的动画一起播放
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
有了这四个方法,我们就可以任意组合了,
ObjectAnimator translationY = ObjectAnimator.ofFloat(iv, "translationY", 0f, 500f,0f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0,1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 3f,1f);
ObjectAnimator rotation = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(alpha).with(scaleY).with(rotation).after(translationY);
animSet.setDuration(5000);
animSet.start();
这两种方式都是可以实现效果的,这里我们先是把4个动画的对象全部创建出来,然后new出一个AnimatorSet对象之后将这三个动画对象进行播放排序,让旋转和缩放和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画。运行一下上述代码,效果如下图所示:
github源码下载