天天看點

Android 基礎動畫之幀動畫詳解

在上一篇 Android 基礎動畫之補間動畫詳解

主要介紹了補間動畫的基本屬性以及補間動畫在Android起始設計之初帶來的一些問題。本篇文章主要介紹的是Android的幀動畫。

幀動畫,我們從字面意思來了解,幀:就是影像動畫中最小機關的單幅影像畫面,相當于電影膠片上的每一格鏡頭。 一幀就是一副靜止的畫面,連續的幀就形成動畫,如電視圖象等。簡單點說就是類似幻燈片播放的那種效果,是以幀動畫的本質就是将一張張的圖檔,通過代碼對這些圖檔進行連續的活動(這樣就形成了動畫)

假設現在有這樣一個效果如圖,這個動畫就類似手機WIFI連接配接信号,從一格到滿格

Android 基礎動畫之幀動畫詳解

效果圖

那麼,使用幀動畫的方式該如何實作該效果?

  • xml方式實作

    檔案名:anim_list.xml (檔案存放路徑: main/res/drawable)

    anim_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/anim_1"
         android:duration="200"/>
     <item
         android:drawable="@drawable/anim_2"
         android:duration="200"/>
     <item
         android:drawable="@drawable/anim_3"
         android:duration="200"/>
     <item
         android:drawable="@drawable/anim_4"
         android:duration="200"/>
     </animation-list>
               
    布局
    <ImageView
         android:id="@+id/iv"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:background="@drawable/anim_list"/>
               
    擷取背景
    //擷取背景,并将其強轉成AnimationDrawable
     AnimationDrawable animationDrawable = (AnimationDrawable) iv.getBackground();
     //判斷是否在運作
     if(!animationDrawable.isRunning()){
         //開啟幀動畫
         animationDrawable.start();
     }
               

以上是通過XML方式完成幀動畫,下面是通過代碼方式完成幀動畫

  • 代碼方式實作
    //建立一個AnimationDrawable
      AnimationDrawable animationDrawable1 = new AnimationDrawable();
      //準備好資源圖檔
      int[] ids = {R.drawable.anim_1,R.drawable.anim_2,R.drawable.anim_3,R.drawable.anim_4};
      //通過for循環添加每一幀動畫
      for(int i = 0 ; i < 4 ; i ++){
          Drawable frame = getResources().getDrawable(ids[i]);
      //設定時長
          animationDrawable1.addFrame(frame,200);
      }
      animationDrawable1.setOneShot(false);
      //将動畫設定到背景上
      iv.setBackground(animationDrawable1);
      //開啟幀動畫
      animationDrawable1.start();
               

關于幀動畫使用XML形式編寫值得一提的是:<animation-list>必須是根節點,這個根節點包含一個或者多個<item>元素,<item>簡單了解就是類似一幀的動畫資源。item屬性有:

android:oneshot屬性,其中true代表隻執行一次,false循環執行;android:drawable ,代表一個frame的Drawable資源;android:duration,代表一個frame顯示多長時間。

值得一提的是:AnimationDrawable的start()方法不能在Activity的onCreate方法中調用,因為AnimationDrawable有可能在加載的時候還沒有完全加載到window上,是以最好的使用時機是onWindowFocusChanged()方法中。

下面在給大家舉個幀動畫的例子,下面是4張資源圖:

Android 基礎動畫之幀動畫詳解

progress_loading_image_01.png

Android 基礎動畫之幀動畫詳解

progress_loading_image_02.png

Android 基礎動畫之幀動畫詳解

progress_loading_image_03.png

Android 基礎動畫之幀動畫詳解

progress_loading_image_04.png

  • 首先,在drawable檔案夾下,建立一個 loading.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/progress_loading_image_01" android:duration="80"/>
    <item android:drawable="@drawable/progress_loading_image_02" android:duration="80"/>
    <item android:drawable="@drawable/progress_loading_image_03" android:duration="80"/>
    <item android:drawable="@drawable/progress_loading_image_04" android:duration="80"/>
</animation-list>
           
  • 接着,布局XML檔案中引用該 loading.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <ImageView
        android:layout_gravity="center"
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/loading"/>

    <Button
        android:layout_marginTop="20dp"
        android:layout_marginRight="80dp"
        android:layout_marginLeft="80dp"
        android:text="跑跑更健康"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

</LinearLayout>
           
  • 最後,解析XML,并開啟動畫:
public class AnimActivity extends BaseActivity{
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_anim);

        ImageView iv = findViewById(R.id.iv);

        //擷取背景,并将其強轉成AnimationDrawable
        AnimationDrawable animationDrawable = (AnimationDrawable) iv.getBackground();
        //判斷是否在運作
        if(!animationDrawable.isRunning()){
            //開啟幀動畫
            animationDrawable.start();
        }
    }
}
           
  • 最終效果如下:
    Android 基礎動畫之幀動畫詳解
    跑跑更健康

關于幀動畫的基本介紹和兩種使用就介紹完畢了。

如果這篇文章對你有幫助,希望各位看官留下寶貴的star,謝謝。

Ps:著作權歸作者所有,轉載請注明作者, 商業轉載請聯系作者獲得授權,非商業轉載請注明出處(開頭或結尾請添加轉載出處,添加原文url位址),文章請勿濫用,也希望大家尊重筆者的勞動成果

繼續閱讀