Android中动画的分类
View Animation 视图动画 只是实现动画效果 对view本身的属性并未有影响
Frame 帧动画 iv.setBackgroundResource
Tween 补间动画:淡入淡出 缩放 平移 旋转

淡入淡出 透明度的改变
缩放 宽高尺寸
平移 位置
旋转

alpha通过控制透明度实现动画的效果
透明度的变化情况 0.0-1.0 0.0完全透明 1.0表示完全不透明
android:fromAlpha=”浮点” 设置动画的起始的透明度
android:toAlpha=”浮点” 设置动画的结束的透明度

以下属性的设置补间动画都可可以设置
android:duration=”时间的毫秒值” 设置动画的持续时间
android:fillAfter=”true” 指定为true表示动画结束时维持在最终的状态 默认恢复到原始状态
android:repeatCount=”infinite” 动画默认执行一次 infinite表示动画一直执行
android:repeatMode=”” 设置动画的重复启动模式 restart表示动画一直从from变化到to
reverse 表示动画从from-to-from-to
Property Animation 属性动画 通过动画的变换效果执行改变当前view的属性 sdk3.0之后出现

Frame 帧动画 app中应用场景(页面未加载出来之前的动画效果)

帧动画 界面加载数据时多帧图片实现轮播类似gif的效果
1.res/drawable 定义一个xml文件

<animation-list android:onShot="false">
    <item android:drawable="@mipmap/xxx" android:duration="">
 </animation-list>

2.在布局文件的xml android:background=”@drawable/帧动画的xml文件”
3.载布局文件的activity中
AnimationDrawable drawable=(AnimationDrawable)iv.getBackground();
4.drawable.start(); drawable.stop();
补间动画
xml文件定义动画的效果
1.res下创建anim文件夹 补间动画的xml文件放到该文件下

淡入淡出
<Alpha android:fromAlpha="起始透明度" android:toAlpha="结束透明度"/>
平移
translate android:fromXDelta=”起始x” android:toXDelta=”结束x”
android:fromYDelta=”起始y” android:toYDelta=”结束y”
旋转
rotate android:fromDegrees=”起始角度” android:toDegrees=”结束角度”
android:pivotX=”圆心x” android:pivotY=”圆心y”

缩放 scale android:fromXScale=”起始x” android:toXScale=”结束x”
android:fromYScale=”起始y” android:toYScale=”结束y”
android:pivotX=”缩放中心x” android:pivotY=”缩放中心y”
组合

Animation animation=AnimationUtils.LoadAnimation(上下文,R.anim.xxx);
iv.startAnimation(animation);

代码中实现 AlphaAnimation ScaleAnimation RotateAnimation
TranslateAnimation
xml文件总设置的没中补间动画的属性 通过代码中对象的构造函数指定

属性动画
xml文件定义动画效果
1.项目的res文件夹下创建animator文件夹 存放属性动画的xml文件
2.设置一个属性

<objectAnimator android:propertyName="属性动画操作的属性"  android:valueType="操作属性值的类型"
                 android:valueFrom="操作动画的起始值"  android:valueTo="操作动画的结束值">
设置多个属性
         <Set android:ordering=“”>
            <objectAnimator/>
            ...
         </set>

3.java代码中使用 Animator animator=AnimatorInflater.loadAnimtor(上下文,R.animator.xx);
animator.setTarget(需要使用动画的view对象);
animator.start();
java代码实现属性动画
单一属性设置 ObjectAnimator animator=ObjectAnimator.of**Float**(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
animator.setTarget(需要使用动画的view对象);
animator.start();
多个属性的设置
ObjectAnimator animator1=ObjectAnimator.ofFloat(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
ObjectAnimator animator2=ObjectAnimator.ofFloat(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
AnimatorSet set=new AnimatorSet();
set.play(animator1).after(animator2);//android:ordering=“sequentially”
set.play(animator1).with(animator2);//android:ordering=“together”
set.start();

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleX"
    android:valueType="floatType"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:duration="5000"
    android:repeatCount="infinite"
    android:repeatMode="restart"
    >
<!--
   android:propertyName="属性的名称" 表示当前属性动画操作的属性的是什么
   android:valueType="floatType" 表示当前属性动画操作的属性取值的类型

   android:valueFrom="" 表示当前操作的属性值的起始值
    android:valueTo=""  表示当前操作的属性值的结束值
-->
</objectAnimator>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="sequentially">
<!--
  set 属性  android:ordering 表示set标签中多个动画效果的执行次序
  sequentially 依次执行   together表示set中设置的动画效果一起执行
-->
    <objectAnimator
        android:propertyName="scaleX"
        android:valueType="floatType"
        android:valueFrom="1.0"
        android:valueTo="3.0"
        android:duration="5000"
        />
    <objectAnimator
        android:propertyName="scaleY"
        android:valueType="floatType"
        android:valueFrom="1.0"
        android:valueTo="4.0"
        android:duration="5000"
        />
</set>

帧动画示例:

public class MainActivity extends AppCompatActivity {
    private ImageView iv;
    private AnimationDrawable drawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv= (ImageView) findViewById(R.id.iv);
        //设置当前的图片的资源为帧动画的xml文件
        iv.setBackgroundResource(R.drawable.frame_animation);
        drawable= (AnimationDrawable) iv.getBackground();
    }

    public void click(View view){
        switch (view.getId()){
            case R.id.btn_open:
                if(!drawable.isRunning()){
                    drawable.start();//启动动画
                }
                break;
            case R.id.btn_close:
                if(drawable.isRunning()){
                    drawable.stop();//停止动画
                }
                break;
        }
    }
}

补间动画:

public class MainActivity extends AppCompatActivity {
    private ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv= (ImageView) findViewById(R.id.iv);
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"我被点击了!",Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void click(View view){
        Animation animation=null;
        switch (view.getId()){
            case R.id.btn_alpha://透明度
//                loadAnimation(上下文,表示当前加载动画xml文件的资源id)加载动画的函数
                animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha_anim);
                break;
            case R.id.btn_scale://缩放
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale_anim);
                break;
            case R.id.btn_route:// 旋转
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.route_anim);
                break;
            case R.id.btn_transltion://平移
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.translte_anim);
                break;
            case R.id.btn_all://组合
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.set_anim);
                break;
        }
        //startAnimation()启动动画
        iv.startAnimation(animation);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.0"
    android:toAlpha="0.5"
    android:duration="2000"
    android:fillAfter="true"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    >
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="-90"
    android:toDegrees="180"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="3000"
    android:fillAfter="true"
    android:repeatCount="infinite"
    android:repeatMode="restart"
    >
<!--
     rotate 旋转
    android:fromDegrees="旋转的起始角度"
    android:toDegrees="旋转的结束角度"
     toDegrees-fromDegrees 正数 顺时针  负数 逆时针
    android:pivotX=""
    android:pivotY="
       以x轴和y轴确定旋转中心的坐标
     取值三种情况  直接指定数值  0%-100%表示旋转中心以view自身的xy作为参考
       0%p-100%p 表示以view的父布局或者父容器的xy作为参
-->

</rotate>
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="1.0"
    android:toXScale="0.5"
    android:fromYScale="1.0"
    android:toYScale="0.5"
    android:pivotX="1.0"
    android:pivotY="1.0"
    android:duration="2000"
    android:fillAfter="true"
    >
<!--
    scale 缩放 通过尺寸的改变实现动画效果

    android:fromXScale=""  表示动画起始x轴的尺寸
    android:fromYScale=""   表示动画起始y轴的尺寸
    android:toXScale=""  表示动画结束x轴的尺寸
    android:toYScale=""  表示动画结束Y轴的尺寸
    android:pivotX=""  表示缩放x轴的中心点
    android:pivotY=""  表示缩放y轴的中心点
-->
</scale>
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0"
    android:toXDelta="100"
    android:fromYDelta="0"
    android:toYDelta="300"
    android:duration="5000"
    android:fillAfter="true"
    >
<!--
    平移  位置改变的动画效果
    android:fromXDelta=""  表示起始和结束x轴的变化
    android:toXDelta=""
    android:fromYDelta=""  表示起始和结束y轴的变化
    android:toYDelta=""
-->
</translate>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:repeatMode="restart"
     android:repeatCount="5"
    >
   <alpha
       android:duration="3000"
       android:fromAlpha="0.0"
       android:toAlpha="0.3"
       />
    <rotate
        android:duration="4000"
        android:fromDegrees="-90"
        android:toDegrees="90"
        android:pivotX="50%p"
        android:pivotY="50%p"
        />
</set>