Android--Animation动画的基本使用与介绍

来源:互联网 发布:美工岗位职责 编辑:程序博客网 时间:2024/06/09 21:47

一、Animation动画的基本介绍

Animation,是一个可以实现Android UI界面动画的效果,同时,Animation也提供了一系列的动画效果,其中分别有:透明度动画、收缩动画、位移动画、旋转动画。这些动画效果绝大多数可以运用在控件中。


二、Animation动画的类型

Android中Animation动画的类型分为四部份类型组成:

1、Alpha——渐变透明度动画效果

2、Scale——渐变收缩动画效果

3、Translate——画面位移动画效果

4、Rotate——画面旋转动画效果


三、Animation动画的模式

Android中Animation动画的模式分为两种:

1、tweened animation(渐变动画),其中分别是Alpha和Scale

2、frame by frame(画面转换动画),其中分别是Translate和Rotate


四、Animation动画的两种格式

1、xml文件中定义动画

2、JavaCode中定义动画

说到Animition动画的两种格式,无非就是写法了,在日常开发中,一般写法有xml定义动画和Javacode定义动画,但是大多数人可能比较喜欢xml定义,因为xml定义动画整理起来比较方便和规范,而用Javacode编写虽然也能实现和xml定义动画一模一样的效果,但是用JavaCode去定义动画只能增加代码的复杂性。在本文中,我们暂时先介绍xml定义动画的基本使用,有关javacode定义动画的使用,下次有时间再给大家讲解一下。


五、如何在xml文件中定义动画

步骤如下

1、新建Android项目

2、在res目录中新建anim文件夹

3、在anim文件夹中新建一个my_animation.xml文件

4、在my_animation.xml文件中编写动画代码

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <alpha />    <scale />    <translate />    <rotate /></set>

六、Aimation动画的解析--XML

1、alpha--渐变透明度动画

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <alpha        android:duration="2000"        android:fromAlpha="0.0"        android:toAlpha="1.0"></alpha>    <!--        alpha透明度渐变动画效果        浮点数值:        fromAlpha:属性为动画开始时的透明度        toAlpha:属性为动画结束时的透明度        说明:        0.0表示完全透明        1.0表示完全不透明        以上可以取值为0.0-1.0之间float类型的数字        长整数值:        duration:属性为动画的持续时间    --></set>
在这里,我设置的是fromAlpha0.0到toAlpha1.0,由此可见透明动画从开始的完全透明转为结束时的完全不透明。


2、scale--渐变收缩动画

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <scale        android:duration="2000"        android:fromXScale="0.0"        android:fromYScale="0.0"        android:pivotX="50%"        android:pivotY="50%"        android:toXScale="1.0"        android:toYScale="1.0" />    <!--       scale尺寸收缩动画效果              浮点数值:       fromXScale:属性为动画起始时 X坐标上的伸缩尺寸       toXScale:属性为动画结束时 X坐标上的伸缩尺寸       fromYScale:属性为动画起始时 Y坐标上的伸缩尺寸       toXScale:属性为动画结束时 Y坐标上的伸缩尺寸       说明:       0.0表示收缩到没有       1.0表示正常无伸缩       值小于1.0表示收缩       值大于1.0表示放大        pivotX     属性为动画相对于物件的X坐标的开始位置        pivotY     属性为动画相对于物件的Y坐标的开始位置       长整数值:       duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒   --></set>
我这里设置了fromXScale起点坐标x为0.0和fromYScale起点坐标y为0.0,也就是说首先动画是从收缩到没有的,看不见的一个状态。然后我再通过设置了toXScale1.0结束时x坐标和toYScale1.0结束时y坐标,也就是说最终结束时候x坐标和y坐标分别放大了从原来的没有到有而已。那如果我想方法到原来图片的2倍怎么办呢?其实很容易,只要修改toXScale和toYScale各自为2.0就可以了。


3、translate--画面位移动画

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:duration="2000"        android:fromXDelta="0"        android:fromYDelta="0"        android:toXDelta="500"        android:toYDelta="-350">    </translate>    <!--      translate画面位移动画效果       浮点数值:       fromXDelta:属性为动画开始时,x坐标上的位置       toXDelta:属性为动画结束时,x坐标上的位置       fromYDelta:属性为动画开始时,y坐标上的位置       toYDelta:属性为动画结束时,y坐标上的位置       长整数值:       duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒   --></set>
由此可见,toXDelta等于500表示向右平移500px,而toYDelta等于-350,表示向上平移350px。整体平移动画效果看起来就是从原始位置慢慢平移到右上角位置。


4、rotate--画面旋转动画

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <rotate        android:duration="3000"        android:fromDegrees="0"        android:pivotX="50%"        android:pivotY="50%"        android:toDegrees="+360">    </rotate>    <!--     rotate画面旋转动画效果     浮点数值:     fromDegrees:属性为动画起始时物件的角度     toDegrees:属性为动画结束时物件的角度,在这里我设置了+360,表示根据物件旋转了一圈         说明:     当角度为正数表示顺时针旋转     当角度为负数表示逆时针旋转      pivotX     属性为动画相对于物件的X坐标的开始位置      pivotY     属性为动画相对于物件的Y坐标的开始位置             长整数值:     duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒 --></set>
由于我这里设置了formDegress为0表示物件开始旋转角度为0,toDegress为+360表示物件结束时旋转角度为360度,结合起来也就是说从一个0角度的物件旋转到360一圈后的物件。


七、如何在Java代码中加载我们解析好的xml动画文件

1、创建动画加载构造器

//第一个参数Context为程序的上下文    //第二个参数id为动画XML文件的引用//例子:myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_anim);//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件

具体代码如下:

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Animation myAnimation;    private Button bt_alpha;    private Button bt_scale;    private Button bt_translate;    private Button bt_rotate;    private ImageView animation_iv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        bt_alpha= (Button) this.findViewById(R.id.bt_alpha);        bt_scale= (Button) this.findViewById(R.id.bt_scale);        bt_translate= (Button) this.findViewById(R.id.bt_translate);        bt_rotate= (Button) this.findViewById(R.id.bt_rotate);        animation_iv= (ImageView) this.findViewById(R.id.animation_iv);        bt_alpha.setOnClickListener(this);        bt_scale.setOnClickListener(this);        bt_translate.setOnClickListener(this);        bt_rotate.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.bt_alpha:                //加载透明度动画并且通过图片控件去启动动画                myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha_animation);                animation_iv.startAnimation(myAnimation);                break;            case R.id.bt_scale:                //加载收缩动画并且通过图片控件去启动动画                myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale);                animation_iv.startAnimation(myAnimation);                break;            case R.id.bt_translate:                //加载位移动画并且通过图片控件去启动动画                myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate);                //setFillAfter(true)表示执行位移动画结束后,控件将停留在执行结束的状态                myAnimation.setFillAfter(true);                animation_iv.startAnimation(myAnimation);                break;            case R.id.bt_rotate:                //加载旋转动画并且通过图片控件去启动动画                myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);                animation_iv.startAnimation(myAnimation);                break;        }    }}

在这里我分别创建了四个按钮点击事件去加载4个不同的动画效果。


activity_main布局文件如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"    android:orientation="vertical"    android:background="#FFFFFF"    tools:context="com.soft0754.animation.MainActivity">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <Button            android:id="@+id/bt_alpha"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="透明动画" />        <Button            android:id="@+id/bt_scale"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="收缩动画" />        <Button            android:id="@+id/bt_translate"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="位移动画" />        <Button            android:id="@+id/bt_rotate"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="旋转动画" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:gravity="center">        <ImageView            android:id="@+id/animation_iv"            android:src="@drawable/pc"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />    </LinearLayout></LinearLayout>

布局文件中没什么的就是只有4个按钮和我们一张要展示的动画图片对象,好了下面我们一起看看运行后的效果图。



八、Animation其他常用的方法

1、setFillAfter(boolean fillAfter)

如果fillAfter的值为true,则表示动画执行后,控件停留在执行结束时候的状态。

2、setFillBefore(boolean fillBefore)

如果fillAfter的值为true,则表示动画执行后,控件将回到动画执行之前的状态。

3、 setStartOffset(long startOffset)

设置动画执行之前的等待时间。

4、setRepeatCount(int repeatCount)

设置动画的重复播放次数。

5、setRepeatMode(int repeatMode)

设置动画的重复播放的模式,在这里分别有两种模式,一种是RESTART表示重新开始重复执行,另一种是REVERSE表示反向执行。


不过这里需要注意的是:重复播放次数必须和重复播放模式加在一起才能起到作用。

当然了,这些常用方法你也可以定义在xml文件中,例如我在xml定义一个旋转动画为360度,重复2次并且播放模式为重新开始的物件:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <rotate        android:duration="3000"        android:fromDegrees="0"        android:pivotX="50%"        android:pivotY="50%"        android:repeatMode="restart"        android:repeatCount="2"        android:toDegrees="+360">    </rotate></set>

效果如下:



九、Animation--list逐帧动画的基本介绍
一说起Animationlist增动画的实现,现在越来越多手机App在启动页面中都有一个加载动画效果,类似于美团,饿了么等等,动画效果非常好看,而这个加载动画效果可以采用Animation-list逐帧动画去实现,那么如何实现呢,现在让我们来一起学习吧!


首先我们先看看效果图:


大家有没有发现,所谓逐帧动画就是一张张图片合并在一起,让他实现动态旋转的这样一个过程,我这里分别准备了12张图片资源,如下图:


其实这12张我是从网上下载1张过来的而已,也就是上图中的第一张是原图的,然后我通过ps去旋转它,由于旋转了1圈,我这里12张图片资源,所以每张图片我通过ps转换的角度就是30度。当然了,以后如果需要逐帧动画最好的让公司美工妹子给你准备吧,细心的你其实应该发现了图片旋转的时候看起来不是效果很好,哈哈,其实是的,那可能是因为图片在ps处理旋转后保存的中心点定位不准的原因。所以我们看起来效果并不是很好。下面让我们一起来看看逐帧动画是如何实现的。


十、Animation--list逐帧动画的基本实现

1、准备好图片资源,这里我采用的是12张图片

2、在res-drawable目录下新建my_list.xml文件,

这里需要注意的是Animation--list逐帧动画资源是放在drawable目录下的,而不是anim目录下的。

3、在my_list.xml文件里面编写逐帧动画代码,代码如下:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"    android:oneshot="false">    <!--其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画        drawable表示每一个逐帧动画的图片资源,我这里采用一共有12帧        duration表示每一帧执行的时间    -->    <item        android:drawable="@drawable/list_1"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_2"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_3"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_4"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_5"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_6"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_7"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_8"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_9"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_10"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_11"        android:duration="50">    </item>    <item        android:drawable="@drawable/list_12"        android:duration="50">    </item></animation-list>
这里逐帧动画xml代码已经定义好了,下面让我们一起来看看怎么去启动或者停止我们这个定义好的my_list.xml逐帧动画。


4、启动或停止逐帧动画

import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.animation.Animation;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Button bt_list;    private AnimationDrawable animationDrawable;    private ImageView animation_iv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        bt_list= (Button) this.findViewById(R.id.bt_list);        animation_iv= (ImageView) this.findViewById(R.id.animation_iv);        bt_list.setOnClickListener(this);        //设置图片控件一开始应用的是我们的逐帧动画资源        animation_iv.setImageResource(R.drawable.my_list);        //给逐帧动画资源赋值        animationDrawable = (AnimationDrawable) animation_iv.getDrawable();        //先设置动画一开始进来是停止的,这里默认是启动的        animationDrawable.stop();    }    @Override    public void onClick(View v) {        switch (v.getId()){                       case R.id.bt_list:                //判断是否逐帧动画是否正在运行,如果正在运行的话我们点击按钮时候让它停止,否则启动逐帧动画                if (animationDrawable.isRunning()) {                    animationDrawable.stop();                }else {                    animationDrawable.start(); //启动逐帧动画                }                break;        }    }}



有关于Android中的动画其实还有很多,由于时间关系未能给大家一一讲解,其他动画当中例如还有集合动画,抛物线动画等等,以后有机会的话再给大家讲解,此致!此文章到此结束!希望对大家在日常开发当中有所帮助!