Android动画(一):View动画(补间动画)

一、动画的简单介绍:
在Android项目的开发过程中,如果某些控件或者界面突然的出现或者消失,会造成非常差的用户体验。所以我们需要为特定的控件或者界面添加一些动画效果.

二、分类:View动画(补间动画)、帧动画、属性动画.

三、详细介绍:
①View动画(补间动画):通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度),而产生动画效果,是一种渐进的动画,还可以自定义。

②帧动画:也是View动画的一种,只是与常见的View动画的表现形式不同而已。帧动画是通过顺序播放一系列图像而产生的动画效果,也就是图片切换动画,若图片过多会导致OOM。

③属性动画:通过动态的改变对象的属性值,从而达到动画的效果,API11之后出现,低版本中需要添加兼容库来完成。

四、VIew动画:以下的四种动画都可以通过Java代码或者是在xml中来创建的,建议使用在xml中定义的,使可读性更好,更方便复用。

1.Java类中:
平移动画:TranslateAnimation类
缩放动画:ScaleAnimation类
旋转动画:RotateAnimation类
透明度动画:AlphaAnimation类

2.xml中的标签:
平移动画:<translate>
缩放动画:<scale>
旋转动画:<rotate>
透明度动画:<alpha>
联合动画(可以包含以上一系列的动画):

3.xml中的共有属性:
startOffset:延时(int类型,表示动画多少后执行,单位毫秒)
fillAfter:动画结束的位置(boolean类型,true代表停在结束为止,false代表停在开始位置)
repeatCount:动画重复的次数(int类型,表示动画重复持续的次数,-1代表无限循环)
repeatMode:动画重复的模式(restart:从开始位置重新开始,reverse:往复循环)
duration:动画时长(int类型,单位毫秒)

五、平移动画(TranslateAnimation):

1.官方文档:An animation that controls the position of an object. See the full package description for details and sample code.
大致意思:一个动画控制对象的位置。看到完整的包描述细节和示例代码。

2.xml属性:
fromXDelta:x的起始值(float类型,也可以是百分比或者是负数)
toXDelta:x的结束值(float类型,也可以是百分比或者是负数)
fromYDelta:y的起始值(float类型,也可以是百分比或者是负数)
toYDelta:y的结束值(float类型,也可以是百分比或者是负数)

3.Java代码中使用:

//平移动画
private void showTranslateAnim() {
    //创建平移动画对象
    TranslateAnimation translateAnimation = new TranslateAnimation(
            //参数:Animation.RELATIVE_TO_SELF(先对自身)
            //Animation.RELATIVE_TO_PARENT(相对父容器)
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1,
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1
    );
    //设置持续的时间
    translateAnimation.setDuration(2000);
    //设置循环的次数
    translateAnimation.setRepeatCount(10);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    translateAnimation.setRepeatMode(Animation.REVERSE);
    //设置动画
    imageView.startAnimation(translateAnimation);
}

4.xml中使用:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- startOffset是延时多少秒才开始动画-->
    <!-- fillAfter true代表动画停止时是停在结束为止-->

    <translate
android:duration="1000"
        android:fillAfter="true"
    android:startOffset="1000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:repeatCount="3"
        android:toXDelta="100%p"
        android:toYDelta="100%p" />
    <!-- 100%p代表计算的时候是相对父容器100%的位置-->
</set>

六.缩放动画(ScaleAnimation):

1.官方文档:An animation that controls the scale of an object. You can specify the point to use for the center of scaling.
大致意思:一个动画控制测量对象,你可以使用指定要点居中缩放。

2.xml的属性:
fromXScale:水平方向缩放的起始值(float类型,1:正常,1.5:代表缩放1.5倍)
toXScale:水平方向缩放的结束值(float类型,1:正常,1.5:代表缩放1.5倍)
fromYScale:垂直方向缩放的起始值(float类型,1:正常,1.5:代表缩放1.5倍)
toYScale:垂直方向缩放的结束值(float类型,1:正常,1.5:代表缩放1.5倍)
pivotX:缩放的轴点的x坐标(float类型,可以是百分比,若50%,则为中心)
pivotY:缩放的轴点的y坐标(float类型,可以是百分比,若50%,则为中心)

3.Java代码中使用:

//缩放动画
private void showScaleAnimation() {
    //创建缩放动画对象
    ScaleAnimation scaleAnimation = new ScaleAnimation(
            //前两个参数:从x轴从多少缩放到多少,3、4参数是y轴从多少缩放到多少
            1f,5f,1f,5f,
            Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0.5f
    );
    //设置持续的时间
    scaleAnimation.setDuration(1000);
    //设置循环的次数
    scaleAnimation.setRepeatCount(5);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    scaleAnimation.setRepeatMode(Animation.REVERSE);
    //设置动画
    imageView.startAnimation(scaleAnimation);
}

4.在xml中使用:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:repeatCount="3"
        android:duration="1000"
        android:fillAfter="true"
        android:fromXScale="1"
        android:fromYScale="1"
        android:startOffset="1000"
        android:toXScale="5"
        android:toYScale="5" />
</set>

七、旋转动画(RotateAnimation):

1.官方文档:An animation that controls the rotation of an object. This rotation takes place in the X-Y plane. You can specify the point to use for the center of the rotation, where (0,0) is the top left point. If not specified, (0,0) is the default rotation point.
大致意思:一个动画控制的旋转对象。这发生在x - y平面旋转。您可以指定要使用的点为中心的旋转,在(0,0)左上角点。如果不指定,(0,0)是默认旋转点。
  
2.xml的属性:
fromDegrees:旋转的起始角度(float类型,360一周)
toDegress:旋转的结束角度(float类型,正数是顺时针,负数是逆时针)
pivotX:旋转的轴点x坐标:(float类型,可以是百分比,若50%,则为中心)
pivotY:旋转的轴点y坐标:(float类型,可以是百分比,若50%,则为中心)

3.Java中使用:

//旋转动画
private void showRotate() {
  RotateAnimation rotateAnimation = new RotateAnimation(
            //参数1:起始度数;参数2:结束度数
            0, 180,
            //RELATIVE_TO_SELF:相对自身,Animation.RELATIVE_TO_PARENT:相对父容器
            //参数4、6:旋转的中心坐标
            Animation.RELATIVE_TO_SELF, 2f,
            Animation.RELATIVE_TO_SELF, 2f
    );
    //可以设置动画的重复次数
    rotateAnimation.setRepeatCount(5);
    //设置动画每次的持续时间
    rotateAnimation.setDuration(3000);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    rotateAnimation.setRepeatMode(Animation.REVERSE);
    //设置动画
    imageView.startAnimation(rotateAnimation);
}

4.xml中使用:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="3000"
        android:fillAfter="true"
        android:fromDegrees="0"
        android:pivotX="100%"
        android:pivotY="100%"
        android:startOffset="1000"
        android:toDegrees="180" />
</set>

八、透明度动画(AlphaAnimation):

1.官方文档:An animation that controls the alpha level of an object. Useful for fading things in and out. This animation ends up changing the alpha property of a Transformation
大致意思:动画控制一个对象的透明度。在事物进入和退出方面很有用。这个动画最终改变透明度的性质实质上是转换的属性。

2.xml的属性:
fromAlpha:透明度的起始值(float类型,0为全透明,1为不透明)
toAlpha:透明度的结束值(float类型,0为全透明,1为不透明)

3.Java代码中使用:

private void showAlpha() {
    AlphaAnimation alphaAnimation = new AlphaAnimation(
            //参数1:透明度的起始值,参数2:透明度的结束值
            0, 1
    );
    //可以设置动画的重复次数
    alphaAnimation.setRepeatCount(5);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    alphaAnimation.setRepeatMode(Animation.REVERSE);
    //设置动画每次的持续时间
    alphaAnimation.setDuration(2000);
    //设置动画
    imageView.startAnimation(alphaAnimation);
}

4.xml中使用:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="1000"
        android:fillAfter="true"
        android:fromAlpha="0"
        android:startOffset="1000"
        android:toAlpha="1" />
</set>

九、联合动画():

1.官方文档:Represents a group of Animations that should be played together. The transformation of each individual animation are composed together into a single transform. If AnimationSet sets any properties that its children also set (for example, duration or fillBefore), the values of AnimationSet override the child values.

The way that AnimationSet inherits behavior from Animation is important to understand. Some of the Animation attributes applied to AnimationSet affect the AnimationSet itself, some are pushed down to the children, and some are ignored, as follows:

duration, repeatMode, fillBefore, fillAfter: These properties, when set on an AnimationSet object, will be pushed down to all child animations.
repeatCount, fillEnabled: These properties are ignored for AnimationSet.
startOffset, shareInterpolator: These properties apply to the AnimationSet itself.

Starting with ICE_CREAM_SANDWICH, the behavior of these properties is the same in XML resources and at runtime (prior to that release, the values set in XML were ignored for AnimationSet). That is, calling setDuration(500) on an AnimationSet has the same effect as declaring android:duration=”500” in an XML resource for an AnimationSet object.

大致意思:代表一组动画应该一起使用。每个动画的变换组合在一起成一个动画的变换。如果AnimationSet有很多属性,它的子动画也设置(例如,持续时间或填充之后),AnimationSet会覆盖子动画的设置。

从动画AnimationSet继承行为理解是很重要的。一些动画的属性应用于AnimationSet影响AnimationSet本身,有些属性设置给子动画,和一些被忽略属性,如下:

  持续时间、重复方式、 填充之前、填充之后:这些属性,当上设置一个AnimationSet对象,将设置到子动画上。
  重复次数、填充开关:AnimationSet这些属性将被忽略。
  开始偏移、分享差值器:这些属性适用于AnimationSet本身。

从ICE_CREAM_SANDWICH开始,这些属性的行为是相同的XML资源和在运行时(在释放之前,AnimationSet在XML中设定的值被忽略了)。也就是说,在AnimationSet调用setDuration(500)与在XML资源AnimationSet对象android:duration=”500” 是一样的。
  
2.Java中使用:

//联合动画
private void showAll() {
    //1.旋转动画
    RotateAnimation rotateAnimation = new RotateAnimation(
            //参数1:起始度数;参数2:结束度数
            0, 180,
            //RELATIVE_TO_SELF:相对自身,Animation.RELATIVE_TO_PARENT:相对父容器
            //参数4、6:旋转的中心坐标
            Animation.RELATIVE_TO_SELF, 2f,
            Animation.RELATIVE_TO_SELF, 2f
    );
    //可以设置动画的重复次数
    rotateAnimation.setRepeatCount(5);
    //设置动画每次的持续时间
    rotateAnimation.setDuration(3000);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    rotateAnimation.setRepeatMode(Animation.REVERSE);


    //2、透明度动画
    AlphaAnimation alphaAnimation = new AlphaAnimation(
            //参数1:透明度的起始值,参数2:透明度的结束值
            0, 1
    );
    //可以设置动画的重复次数
    alphaAnimation.setRepeatCount(5);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    alphaAnimation.setRepeatMode(Animation.REVERSE);
    //设置动画每次的持续时间
    alphaAnimation.setDuration(2000);

    //3.缩放动画对象
    ScaleAnimation scaleAnimation = new ScaleAnimation(
            //前两个参数:从x轴从多少缩放到多少,3、4参数是y轴从多少缩放到多少
            1f, 5f, 1f, 5f,
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f
    );
    //设置持续的时间
    scaleAnimation.setDuration(1000);
    //设置循环的次数
    scaleAnimation.setRepeatCount(5);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    scaleAnimation.setRepeatMode(Animation.REVERSE);

    //4.平移动画对象
    TranslateAnimation translateAnimation = new TranslateAnimation(
            //参数:Animation.RELATIVE_TO_SELF(先对自身),x轴的起始位置,x的结束值
            //Animation.RELATIVE_TO_PARENT(相对父容器)
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1,
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1
    );
    //设置持续的时间
    translateAnimation.setDuration(2000);
    //设置循环的次数
    translateAnimation.setRepeatCount(10);
    //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
    translateAnimation.setRepeatMode(Animation.REVERSE);

    AnimationSet anim = new AnimationSet(true);
    //将上述的四种动画加入到集合当中
    anim.addAnimation(alphaAnimation);
    anim.addAnimation(rotateAnimation);
    anim.addAnimation(scaleAnimation);
    anim.addAnimation(translateAnimation);

    imageView.startAnimation(anim);
}

3.xml中使用:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5"
    android:fillAfter="true"
    android:repeatMode="restart">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1" />
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100%p"
        android:toYDelta="100%p" />
    <rotate
        android:fromDegrees="0"
        android:pivotX="100%"
        android:pivotY="100%"
        android:toDegrees="360" />
    <scale
        android:fromXScale="5"
        android:fromYScale="5"
        android:pivotX="1"
        android:pivotY="1" />
</set><?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5"
    android:fillAfter="true"
    android:repeatMode="restart">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1" />
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100%p"
        android:toYDelta="100%p" />
    <rotate
        android:fromDegrees="0"
        android:pivotX="100%"
        android:pivotY="100%"
        android:toDegrees="360" />
    <scale
        android:fromXScale="5"
        android:fromYScale="5"
        android:pivotX="1"
        android:pivotY="1" />
</set>

以上就是对补间动画的介绍,现在贴出所有的代码:

MainActivity中:


package com.example.mac.animationdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button translateBtn, scaleBtn, rotateBtn, alphaBtn, allBtn;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        translateBtn = (Button) findViewById(R.id.translateBtn);
        scaleBtn = (Button) findViewById(R.id.scaleBtn);
        rotateBtn = (Button) findViewById(R.id.rotateBtn);
        alphaBtn = (Button) findViewById(R.id.alphaBtn);
        allBtn = (Button) findViewById(R.id.allBtn);
        imageView = (ImageView) findViewById(R.id.iv);

        translateBtn.setOnClickListener(this);
        scaleBtn.setOnClickListener(this);
        rotateBtn.setOnClickListener(this);
        alphaBtn.setOnClickListener(this);
        allBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {

            //平移动画
            case R.id.translateBtn:
                //调用Java代码
                showTranslateAnim();
                //调用xml
                //Animation anim = AnimationUtils.loadAnimation(this, R.anim.translate);
                //imageView.startAnimation(anim);
                break;

            //缩放动画
            case R.id.scaleBtn:
                //调用Java代码
                showScaleAnim();
                //调用xml
                //Animation anim = AnimationUtils.loadAnimation(this,R.anim.scale);
                // imageView.startAnimation(anim);
                break;
            //旋转动画

            case R.id.rotateBtn:
                //调用Java代码
                showRotate();
                //调用xml
                //Animation anim = AnimationUtils.loadAnimation(this,R.anim.rotate);
                //imageView.startAnimation(anim);
                break;

            //透明度动画
            case R.id.alphaBtn:
                //调用Java代码
                showAlpha();
                //使用xml
                //Animation anim = AnimationUtils.loadAnimation(this,R.anim.alpha);
                //imageView.startAnimation(anim);
                break;

            //联合动画
            case R.id.allBtn:
                //旋转动画
                showAll();
                //调用xml
                // Animation anim = AnimationUtils.loadAnimation(this,R.anim.all);
                //imageView.startAnimation(anim);
                break;
        }
    }

    //联合动画
    private void showAll() {
        //1.旋转动画
        RotateAnimation rotateAnimation = new RotateAnimation(
                //参数1:起始度数;参数2:结束度数
                0, 180,
                //RELATIVE_TO_SELF:相对自身,Animation.RELATIVE_TO_PARENT:相对父容器
                //参数4、6:旋转的中心坐标
                Animation.RELATIVE_TO_SELF, 2f,
                Animation.RELATIVE_TO_SELF, 2f
        );
        //可以设置动画的重复次数
        rotateAnimation.setRepeatCount(5);
        //设置动画每次的持续时间
        rotateAnimation.setDuration(3000);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        rotateAnimation.setRepeatMode(Animation.REVERSE);


        //2、透明度动画
        AlphaAnimation alphaAnimation = new AlphaAnimation(
                //参数1:透明度的起始值,参数2:透明度的结束值
                0, 1
        );
        //可以设置动画的重复次数
        alphaAnimation.setRepeatCount(5);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        alphaAnimation.setRepeatMode(Animation.REVERSE);
        //设置动画每次的持续时间
        alphaAnimation.setDuration(2000);

        //3.缩放动画对象
        ScaleAnimation scaleAnimation = new ScaleAnimation(
                //前两个参数:从x轴从多少缩放到多少,3、4参数是y轴从多少缩放到多少
                1f, 5f, 1f, 5f,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f
        );
        //设置持续的时间
        scaleAnimation.setDuration(1000);
        //设置循环的次数
        scaleAnimation.setRepeatCount(5);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        scaleAnimation.setRepeatMode(Animation.REVERSE);

        //4.平移动画对象
        TranslateAnimation translateAnimation = new TranslateAnimation(
                //参数:Animation.RELATIVE_TO_SELF(先对自身),x轴的起始位置,x的结束值
                //Animation.RELATIVE_TO_PARENT(相对父容器)
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1
        );
        //设置持续的时间
        translateAnimation.setDuration(2000);
        //设置循环的次数
        translateAnimation.setRepeatCount(10);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        translateAnimation.setRepeatMode(Animation.REVERSE);

        AnimationSet anim = new AnimationSet(true);
        //将上述的四种动画加入到集合当中
        anim.addAnimation(alphaAnimation);
        anim.addAnimation(rotateAnimation);
        anim.addAnimation(scaleAnimation);
        anim.addAnimation(translateAnimation);

        imageView.startAnimation(anim);
    }

    //透明度动画
    private void showAlpha() {
        AlphaAnimation alphaAnimation = new AlphaAnimation(
                //参数1:透明度的起始值,参数2:透明度的结束值
                0, 1
        );
        //可以设置动画的重复次数
        alphaAnimation.setRepeatCount(5);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        alphaAnimation.setRepeatMode(Animation.REVERSE);
        //设置动画每次的持续时间
        alphaAnimation.setDuration(2000);
        //设置动画
        imageView.startAnimation(alphaAnimation);
    }

    //旋转动画
    private void showRotate() {
        RotateAnimation rotateAnimation = new RotateAnimation(
                //参数1:起始度数;参数2:结束度数
                0, 180,
                //RELATIVE_TO_SELF:相对自身,Animation.RELATIVE_TO_PARENT:相对父容器
                //参数4、6:旋转的中心坐标
                Animation.RELATIVE_TO_SELF, 2f,
                Animation.RELATIVE_TO_SELF, 2f
        );
        //可以设置动画的重复次数
        rotateAnimation.setRepeatCount(5);
        //设置动画每次的持续时间
        rotateAnimation.setDuration(3000);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        rotateAnimation.setRepeatMode(Animation.REVERSE);
        //设置动画
        imageView.startAnimation(rotateAnimation);
    }

    //缩放动画
    private void showScaleAnim() {
        //创建缩放动画对象
        ScaleAnimation scaleAnimation = new ScaleAnimation(
                //前两个参数:从x轴从多少缩放到多少,3、4参数是y轴从多少缩放到多少
                1f, 5f, 1f, 5f,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f
        );
        //设置持续的时间
        scaleAnimation.setDuration(1000);
        //设置循环的次数
        scaleAnimation.setRepeatCount(5);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        scaleAnimation.setRepeatMode(Animation.REVERSE);
        //设置动画
        imageView.startAnimation(scaleAnimation);
    }

    //平移动画
    private void showTranslateAnim() {
        //创建平移动画对象
        TranslateAnimation translateAnimation = new TranslateAnimation(
                //参数:Animation.RELATIVE_TO_SELF(先对自身),x轴的起始位置,x的结束值
                //Animation.RELATIVE_TO_PARENT(相对父容器)
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 1
        );
        //设置持续的时间
        translateAnimation.setDuration(2000);
        //设置循环的次数
        translateAnimation.setRepeatCount(10);
        //设置重复的模式,Animation.REVERSE:会进行一次倒序播放
        translateAnimation.setRepeatMode(Animation.REVERSE);
        //设置动画
        imageView.startAnimation(translateAnimation);
    }
}

MainActivity的布局文件:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.mac.animationdemo.MainActivity">

    <Button
        android:id="@+id/translateBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="平移动画" />

    <Button
        android:id="@+id/scaleBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/translateBtn"
        android:text="缩放动画" />

    <Button
        android:id="@+id/rotateBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/scaleBtn"
        android:text="旋转动画" />

    <Button
        android:id="@+id/alphaBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/rotateBtn"
        android:text="透明度动画" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/translateBtn"
        android:layout_margin="10dp"
        android:src="@mipmap/ic_launcher" />

    <Button
        android:id="@+id/allBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv"
        android:text="联合动画" />
</RelativeLayout>

动画布局文件(在res下创建new Directory,起名字为anim,然后在anim下新建Animation resource file):

透明度:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="1000"
        android:fillAfter="true"
        android:fromAlpha="0"
        android:startOffset="1000"
        android:toAlpha="1" />
</set>

旋转:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="3000"
        android:fillAfter="true"
        android:fromDegrees="0"
        android:pivotX="100%"
        android:pivotY="100%"
        android:startOffset="1000"
        android:toDegrees="180" />
</set>

缩放:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:repeatCount="3"
        android:duration="1000"
        android:fillAfter="true"
        android:fromXScale="1"
        android:fromYScale="1"
        android:startOffset="1000"
        android:toXScale="5"
        android:toYScale="5" />
</set>

平移:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:startOffset="1000">
    <!-- startOffset是延时多少秒才开始动画-->
    <!-- fillAfter true代表动画停止时是停在结束为止-->

    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:repeatCount="3"
        android:toXDelta="100%p"
        android:toYDelta="100%p" />
    <!-- 100%p代表计算的时候是相对父容器100%的位置-->
</set>

联合:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5"
    android:fillAfter="true"
    android:repeatMode="restart">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1" />
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100%p"
        android:toYDelta="100%p" />
    <rotate
        android:fromDegrees="0"
        android:pivotX="100%"
        android:pivotY="100%"
        android:toDegrees="360" />
    <scale
        android:fromXScale="5"
        android:fromYScale="5"
        android:pivotX="1"
        android:pivotY="1" />
</set>

本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页