Android动画的分类
Android中的动画主要有三类:逐帧动画、补间动画和属性动画,。逐帧动画的原理是利用人类的“视觉残留”,通过改变播放图片的形式来达到动画的效果,在实际开发中使用较少,故本文中不予以展开。主要介绍补间动画和属性动画。
补间动画:主要有旋转、位移、缩放、透明度和组合5种场景。
属性动画:可以说是以上动画的补充,可以作用于对象的任意属性。
补间动画和属性动画的区别
使用补间动画已经可以实现很多的动画效果了,但是仍然有一些局限,所以推出了属性动画作为动画的补充,但它们两者还是存在一些差别的。
1、首先是对象上,逐帧动画就暂且不说了,只针对图像制作动画。补间动画针对的对象则是View类的对象及View的子类,但有时候我们的操作对象不只有View类的对象,还有其他不是View类的对象,这时候补间动画就不能满足我们的需求了,这就诞生了属性动画。属性动画的作用对象不再局限View类及其子类,从而能够满足我们更多的需求。
2、然后是作用方法上,补间动画主要针对View指定的属性,比如position、alpha等等,而属性动画作用对象的任意属性,例如背景颜色等等。
3、最后实在作用效果上,补间动画达到的只是视觉上的效果,例如使用补间动画将某一个可点击的View移动到了界面的另一个位置,当你想要触发改View的点击事件时,你还是需要点击View原来的位置,因为补间动画只是实现了“视觉”上的移动,而没有做到实际的移动,而使用属性动画移动后的对象,点击移动后的对象才会触发对象的点击事件,因为属性动画实现的是真正意义上的移动,而不仅仅是“视觉”上。
ValueAnimator
valueAnimator是属性动画中最核心的类,属性动画的原理是不断的对值进行更新和改变,来实现动画的效果,我们只需要手动设置相应起始值和对应的终止值以及对应的时间即可以完成一个简单的动画。例如,
ValueAnimator valueAnim = ValueAnimator.ofFloat(0f, 1f);
valueAnim.setDuration(1000);
valueAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float)valueAnimator.getAnimatedValue();
Log.d(TAG, "Value is "+value);
alphaBtn.setAlpha(value);
}
});
即可实现一个简单的值动画,动画效果是在1000ms内alphaBtn的alpha值从0变为1(即可见)。通过给对象的某些属性设置变化的值从而达到动画的效果就是值动画。
ObjectAnimator
ObjectAnimator是ValueAnimator的子类,相比于ValueAnimator,我们更常用的是ObjectAnimator,因为ValueAnimator只是提供了值的过渡、变化,具体要作用到对象的哪个属性还需要我们自己再去设置,而ObjectAnimator可以直接作用于对象的某个属性,而不必我们再次指定需要作用的属性。例如,
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(alphaBtn,"alpha",0f,1f);
objectAnimator.setDuration(1000);
objectAnimator.start();
这种方法也实现了和上面的值动画一样的动画效果,在1000ms内alphaBtn的alpha值从0变为1(即可见)。
组合动画(动画集合AnimatorSet)
一个复杂的动画常常需要多个简单的动画一起组合才能够完成,基于这样的需求,就出现了组合动画AnimatorSet。组合动画使用play()方法控制动画执行的顺序,以组合成复杂的动画。常用的类型有:
AniamtorSet.playTogtether(animator1,animator2) :animator1和animator2同时执行
AniamtorSet.playSequentially(animator1,animator2) : animator1和animator2顺序执行animator2在animator1之后执行
AniamtorSet.start() :开始执行组合动画
Animator监听器
在很多时候我们需要在动画的不同阶段做一些处理,这就要求我们能够识别、监听到动画的各个状态。Animator中提供了一个addListener()方法,该方法接收一个AnimatorListener对象,可以实现对动画状态的监听,给一个Animator添加监听的方法如下,
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
onAnimationStart()会在动画开始的时候被调用;onAnimationEnd()会在动画结束的时候被调用;onAnimationCancel()会在动画取消时被调用;onAnimationRepeat()会在动画重复时被调用。
插值器(Interpolator)
在动画执行的过程中,除了平滑的过渡之外,我们可能需要一些个性化的过渡,这个时候我们就需要用到插值器(Interpolator)来对过渡过程进行一些设置和调整,常用的插值器有线性插值器(LinearInterpolator)、Bezier曲线型插值器(PathInterpolator)、正弦插值器(SinInterpolator)等等。
valueAnim.setInterpolator(new PathInterpolator(0.22f,0.25f,0.00f,1.0f));
如上是给第一个值动画添加了一个Bezier曲线型插值器,根据log中打印出来的value值可以发现,value的值不再是线性变化,而是根据我们设置的PathInterpolator进行了改变,从而达到了控制动画过程的效果。
XML动画
除了在代码里使用Java编写写动画之外,还可以使用XML编写动画,在编写动画的XML我们一共可以使用三中标签 <animator>、<objectAnimator>、<set>,分别对应代码中的ValueAnimator、ObjectAnimator、AnimatorSet。在res目录下新建一个animator文件夹,在里面新建一个alpha.xml,内容如下:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="1000"/>
该动画的使用和之前的动画使用有一点区别,在使用该动画之前需要先初始化(AnimatorInflater.loadAnimator())该动画,并为该动画设置作用的对象(setTarget()),举例如下:
Animator animator = AnimatorInflater.loadAnimator(getApplicationContext(),R.animator.alpha);
animator.setTarget(alphaBtn);
animator.start();
这样就使用XML编写了一个动画效果为在1000ms内alphaBtn的alpha值从0变为1(即可见)的动画。