1. 程式人生 > >Android動畫-Frame Animation(幀動畫)

Android動畫-Frame Animation(幀動畫)

Android動畫主要分為以下三類:

  1. Tweened animation(補間動畫)- 在android3.0(API11)之前支援,該動畫僅僅支援對View操作,而且View在做動畫的時候,View相應的實際屬性值並沒有發生改變,例如:一個Button起始位置left,top,right,bottom為(0, 0, 50, 50),經過水平平移50操作移到(50, 0, 100, 50),然後將該Button固定在平移後的位置,這時候Button的點選事件的觸發區域仍然是(0, 0, 50, 50)。
  2. Frame animation(幀動畫)- 在android3.0(API11)之前支援,該動畫順序播放事先準備好的影象,類似於放電影。
  3. Property animation(屬性動畫)- 在android3.0(API11)開始支援,屬性動畫不像補間動畫,屬性動畫通過改變物件的實際屬性來實現動畫,而且屬性動畫操作的物件不侷限於View。

在本文中,主要介紹Frame animation(幀動畫)的相關使用。

首先,在drawable檔案下準備若干圖片,比如detail1.png、detail2.png、detail3.png、detail4.png和detail5
.png。

1. 幀動畫在xml中的使用

在drawable資料夾下新建一個animation_list.xml檔案,檔案內容如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/detail1" android:duration="500"/>
    <item android:drawable="@drawable/detail2" android:duration="500"/>
    <item
android:drawable="@drawable/detail3" android:duration="500"/>
<item android:drawable="@drawable/detail4" android:duration="500"/> <item android:drawable="@drawable/detail5" android:duration="500"/> </animation-list>

android:oneshot = “false”表示動畫重複執行,”true”表示動畫只允許一次;
android:duration = “500”表示一幀持續的時間。

animation_list.xml在程式碼中的應用:

mButton = (Button) findViewById(R.id.button);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setBackgroundResource(R.drawable.animation_list);
mButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
            AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getBackground();
            animationDrawable.start();
       }
 });

2. 幀動畫在程式碼中的使用

private void createAnimationList(){
        AnimationDrawable animationDrawable = new AnimationDrawable();
        animationDrawable.setOneShot(false);
        for (int i=0; i<5;){
            // 根據包名、檔名以及檔案型別找到檔案對應的id
            int id = getResources().getIdentifier("detail" + ++i, "drawable", getPackageName());
            // 根據id找到對應的資源
            Drawable drawable = getResources().getDrawable(id);
            // 將圖片新增進入AnimationDrawable作為一幀
            animationDrawable.addFrame(drawable, 1000);
        }
        mImageView.setBackgroundDrawable(animationDrawable);
}
mButton = (Button) findViewById(R.id.button);
mImageView = (ImageView) findViewById(R.id.imageView);
createAnimationList();
mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getBackground();
             animationDrawable.start();
        }
});

注意: 幀動畫的start函式不能在onCreate中直接呼叫,因為這個時候視窗還沒有完全建立好,動畫不會按照預期執行。