一:逐帧动画
1.AnimationDrawable与逐帧动画
定义逐帧动画:只要在animation-list中使用item添加动画的帧,并指定每帧的时间即可。
<animation-list>
<item android:drawable="@drawable/image01" android:duration="60"></item>
<item android:drawable="@drawable/image02" android:duration="60"></item>
<item android:drawable="@drawable/image03" android:duration="60"></item>
</animation-list>
AnimationDrawable代表的动画不是默认播放的,它提供了两个方法来启动和停止动画。
start(),stop();
一般用法为:
final AnimationDrawable drawable = (AnimationDrawable)imageView.getBackground();
drawable.start();
二:补间动画(Tween动画)
1.补间动画只需要设置起始和结束以及中间的关键帧,其余帧由系统来完成。
2.Android使用Animation来表示抽象的动画类,它包括以下几个子类。
(1).AlphaAnimation:透明度动画(value[0,1])。创建该动画需要指定动画开始时的透明度,结束时的透明度和动画持续时间。
(2).ScaleAnimation:大小缩放的动画。创建该动画需要指定动画开始时的缩放比(以x,y轴的缩放参数来表示),结束时的缩放比,缩放中心点(pivotX,pivotY),并指定动画持续时间。
(3).TranslateAnimation:位移变化动画,创建该动画时只要指定开始位置(x,y),结束位置,并指定动画持续时间。
(4).RotateAnimation:旋转动画,创建该动画只要指定动画开始时的旋转角度,结束时的旋转角度,旋转中心点(pivotX,pivotY,并指定动画持续时间即可。
Interpolator可以设置动画的快慢变化。
可以通过xml或者java直接创建的两种方式创建补间动画。
xml:创建anim文件夹,在文件夹中创建动画资源,在java代码中通过AnimationUtils.loadAnimation(context,R.anim.xxx);来得到动画。
Java:类似于TranslateAnimation anim = new TranslateAnimation(curx,nextx,cury,nexty);anim.setDuration(200);
也可以通过set建立多个连续动画,并且动画也可以设置监听。
但是补间动画只是在表面上做了动画,而且动画比较局限,所以在很多情况下并不是很实用。
三:属性动画
1.属性动画API:
==Animator:它提供了创建属性动画的基类,通常被继承使用。
==ValueAnimator:负责计算各帧的属性值。它定义了属性动画的绝大部分核心功能,包括计算各帧的属性值。
==ObjectAnimator:它是ValueAnimator的子类,允许程序员对指定对象的属性执行动画。很常用。
==AnimationSet:他是animator的子类,用于组合多个Animator,并指定顺序(可同时播放),play().before()等。
2.属性动画还需要利用一个Evaluator(计算器),该工具类控制如何计算属性值。
IntEvalutor:用于计算int类型属性值得计算器。
FloatEvalutor:用于计算float类型属性值得计算器。
ArgbEvalutor:用于计算以十六机制表示的颜色值得计算器。
TypeEvalutor:他是计算其接口,开发者可以实现该接口来实现自定义计算器,需要除了上面的以外属性可能需要继承该接口。
3.使用ValueAnimator创建动画:
(1).调动ValueAnimator的ofFloat(),ofInt()或者ofObject()静态方法创建ValueAnimator。
(2).调用ValueAnimator的setXXX来设置动画持续时间,差值方式,重复次数等。
(3).调用ValueAnimator的start()方法启动动画。
(4).为其注册AnimatorUpdateListener监听器,在该监听器中可以监听ValueAnimator计算出来的值得改变,并将这些值应用到指定对象。
4.使用ObjectAnimato创建动画
ObjectAnimator anim = ObjectAnimator.ofFloat(foo,"alpha",0f,1f);
anim.setDuration(1000);
anim.start();