1. 程式人生 > >Android--Animation動畫的基本使用與介紹

Android--Animation動畫的基本使用與介紹

一、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中的動畫其實還有很多,由於時間關係未能給大家一一講解,其他動畫當中例如還有集合動畫,拋物線動畫等等,以後有機會的話再給大家講解,此致!此文章到此結束!希望對大家在日常開發當中有所幫助!