【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。