1. 程式人生 > >【Android動畫九章】-AlphaAnimation(漸變動畫)

【Android動畫九章】-AlphaAnimation(漸變動畫)

對於傳統動畫,Android提供了兩類動畫,即Tween(補間動畫)和Frame(幀動畫)。Tween動畫提供了四種動畫形式,即AlphaAnimation(漸變動畫)、RotateAnimation(旋轉動畫)、ScaleAnimation(尺寸動畫)、TranslateAnimation(位移動畫),當然這些動畫可以隨意進行組合成組合動畫AnimationSet。對於幀動畫比較好理解,類似動畫片的原理,一張張圖片按照某種規則進行排序,然後按照一定速度切換起來,由於人眼的視覺暫留特性就會在大腦中形成連貫的動畫畫面了,電影院中的電影就是這種形式的動畫。
下面對AlphaAnimation的用法進行講解:
public class
AlphaAnimation
extends Animation
java.lang.Object
↳ android.view.animation.Animation
↳ android.view.animation.AlphaAnimation
AlphaAnimation繼承自Animation類,常用構造方法如下:
AlphaAnimation(float fromAlpha, float toAlpha)
需要傳入兩個引數,第一個是起始透明度值,第二個是結束透明度值,取值一般在0-1之間。每一種補間動畫都可以通過兩種方式實現,一種程式碼實現,另一種是引入xml檔案實現,下面分別作介紹。

通過程式碼實現

首先看一個例項:
1.佈局檔案(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" tools:context="demo.androidwar.com.animation.MainActivity">
<ImageView android:id="@+id/imageview" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" android:src="@mipmap/ic_launcher"
/>
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" android:onClick="changeAlpha" android:text="改變透明度" android:textSize="16sp" /> </LinearLayout>

引入了一個ImageView控制元件作為動畫操作的物件,引入一個Button用於控制動畫,設定了Button的onClick屬性。
2.MainActivity.java程式碼:

package demo.androidwar.com.animation;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;
    private boolean isAlphaZero = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.imageview);
    }

    public void changeAlpha(View view) {
        if (isAlphaZero) {
            AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);//初始化操作,引數傳入0和1,即由透明度0變化到透明度為1
            imageView.startAnimation(alphaAnimation);//開始動畫
            alphaAnimation.setFillAfter(true);//動畫結束後保持狀態
            alphaAnimation.setDuration(2000);//動畫持續時間,單位為毫秒
            isAlphaZero = false;//標識位
        } else {
            AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);//初始化操作,引數傳入1和0,即由透明度1變化到透明度為0
            imageView.startAnimation(alphaAnimation);//開始動畫
            isAlphaZero = true;//標識位
            alphaAnimation.setFillAfter(true);//動畫結束後保持狀態
            alphaAnimation.setDuration(2000);//動畫持續時間
        }
    }
}

這裡涉及了幾個方法,下面做一下說明:
(1)startAnimation方法:控制元件呼叫該方法,傳入一個動畫物件,可以為控制元件設定動畫效果;
(2)setFillAfter方法:動畫物件呼叫該方法,傳入一個布林型的引數,可以設定該動畫物件的屬性,傳入true表示動畫結束後保持狀態,預設是不保持狀態。
(3)setDuration方法:動畫物件呼叫此方法,傳入毫秒數作為引數,表示動畫持續的時間。
執行例項如下:
這裡寫圖片描述
開始時圖片透明度為1,點選“改變透明度”的按鈕,透明度變為0;再次點選”改變透明度”的按鈕,透明度由0變成1。

引入xml檔案實現

每一種補間動畫都可以通過兩種方式實現,上面講解了通過程式碼控制動畫顯示的實現,下面看一下如何通過引入xml檔案進行動畫效果的實現。
在res資料夾目錄下新建一個anim的資料夾,然後在裡面新建一個名為alpha.xml的xml檔案,程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="1000"
        android:fromAlpha="1"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:repeatCount="3"
        android:fillAfter="true"
        android:repeatMode="restart"
        android:toAlpha="0" />
</set>

set在外圍作為標籤,透明度標籤為alpha,常用屬性這裡解釋一下,duration表示動畫持續時間,fromAlpha表示開始透明度值,toAlpha表示結束透明度,repeatCount表示重複次數,repeatMode表示重複的模式,fillAfter表示結束後是否保持狀態,interpolator表示插值器,可以改變動畫的變化速率。
MainActivity.java程式碼如下:

package demo.androidwar.com.animation;

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.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.imageview);
    }

    public void changeAlpha(View view) {
        Animation alphaAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
        imageView.startAnimation(alphaAnimation);//開始動畫
        alphaAnimation.setFillAfter(true);//動畫結束後保持狀態
        //新增動畫監聽
        alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //動畫開始時回撥
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //動畫結束時回撥
                Toast.makeText(MainActivity.this, "動畫結束", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //動畫重複時回撥
            }
        });
    }
}

這裡用到AnimationUtils的loadAnimation方法獲得一個Animation物件,該方法需要傳入兩個引數,第一個是上下文物件,第二個是動畫檔案。此外,呼叫了AlphaAnimation的setAnimationListener方法設定了動畫監聽,用匿名內部類的方式引入監聽,覆寫了三個方法,分別是動畫開始時、結束時、重複時進行回撥,可以參照註釋,執行專案例項如下:
這裡寫圖片描述
點選動畫,動畫會重複播放三次,播放完之後顯示Toast。