1、补间动画

补间动画又称为View动画,顾名思义它的作用对象是View,补间动画只需指定动画开始,以及动画结束"关键帧", 而动画变化的"中间帧"则由系统计算并补齐,它支持四种动画方式,补间动画的四种分别对应Animation的四个子类(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation),除了以上四个子类它还有一个AnimationSet类,对应xml标签为<set>,它是一个容器,可以包含若干个动画,并且内部也可以继续嵌套<set>集合

补间动画只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000">
    <alpha android:fromAlpha="1" android:toAlpha="1"/>
    <scale android:fromXScale="0" android:fromYScale="0" 
            android:toYScale="1" android:toXScale="1"/>

</set>

2、帧动画

帧动画是顺序播放一组预先定义好的图片,不同于补间动画,放置在xml文件下,使用帧动画也会导致app体积增大,一般我不怎么使用。

①. 用于生成连续的Gif效果图。
②. DrawableAnimation也是指此动画。

使用方式

  1. 在drawable目录下定义XML文件,根节点为animation-list,然后放入定义更好的图片,我这里设置的背景颜色
<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/a" android:duration="2000"/>
    <item android:drawable="@drawable/b" android:duration="2000"/>
    <item android:drawable="@drawable/c" android:duration="2000"/>
</animation-list>

        2.使用 AnimationDrawable 展示动画

tv.setBackgroundResource(R.drawable.an);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AnimationDrawable background = (AnimationDrawable) tv.getBackground();
                background.start();
            }
        });

3.属性动画

属性动画是从3.0及以后出现的,在3.0以前只有补间动画和帧动画,

比较之前的View动画,属性动画更加丰富、好用;
属性动画是真实地改变控件的属性

常用的动画属性:

  • translationX 和 translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
  • rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
  • scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
  • pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
  • x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
  • aplha:透明度,1是完全不透明,0是完全透明。
//横向平移动画
ObjectAnimator o1 = ObjectAnimator.ofFloat(v, "translationX", 0f,300f);
//设置动画时长
o1.setDuration(500);
//启动动画
o1.start();
//纵向平移动画
ObjectAnimator o2 = ObjectAnimator.ofFloat(v, "translationY", 0f,300f);
o2.setDuration(500);
o2.start();
//旋转动画
ObjectAnimator o3 = ObjectAnimator.ofFloat(v, "rotationX", 0f,360f);
o3.setDuration(500);
o3.start();