Android動畫效果之Frame Animation(逐幀動畫)

前言:

      上一篇介紹了Android的Tween Animation(補間動畫) Android動畫效果之Tween Animation(補間動畫),今天來總結下Android的另一種動畫Frame Animation(逐幀動畫)。html

     其餘幾種動畫效果:java

Frame Animation(逐幀動畫):

       逐幀動畫(Frame-by-frame Animations)從字面上理解就是一幀挨着一幀的播放圖片,就像放電影同樣。和補間動畫同樣能夠經過xml實現也能夠經過java代碼實現。接下來藉助目前項目中的一個開獎的動畫來總結如何使用。實現效果以下:android

具體實現過程:

1.)在res/drawable目錄下一個文件lottery_animlist.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="@mipmap/lottery_1" android:duration="200" /> <item android:drawable="@mipmap/lottery_2" android:duration="200" /> <item android:drawable="@mipmap/lottery_3" android:duration="200" /> <item android:drawable="@mipmap/lottery_4" android:duration="200" /> <item android:drawable="@mipmap/lottery_5" android:duration="200" /> <item android:drawable="@mipmap/lottery_6" android:duration="200" /> </animation-list>
複製代碼

根節點是animation-list(動畫列表),裏面有一個或者多個item節點組成,oneshot屬性表示是否只播放一次,true表示只會播放一次,false表示一直循環播放,內部用item節點聲明一個動畫幀,android:drawable指定此幀動畫所對應的圖片資源,android:druation表明此幀持續的時間,整數,單位爲毫秒。api

注意:eclipse

   以前使用eclipse或者Android ADT開發的時候,文件能夠放在res/anim和res/drawable兩個文件夾下面,雖然谷歌推薦放在res/drawable文件夾下可是不會報錯,在使用Android studio時候就沒那麼幸運了,若是不放在res/drawable文件夾下面會報以下錯誤:佈局

2.)用ImageView控件做爲動畫載體來顯示動畫

複製代碼
 <ImageView android:id="@+id/animation_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:src="@drawable/lottery_animlist" />
複製代碼

這個時候咱們運行一下,發現動畫沒有運行而是停留在第一幀,那是由於AnimationDrawable播放動畫是依附在window上面的,而在Activity onCreate方法中調用時Window還未初始化完畢,全部纔會停留在第一幀,要想實現播放必須在onWindowFocusChanged中添加以下代碼:post

imageView.setImageResource(R.drawable.lottery_animlist);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); animationDrawable.start();

若是想要中止播放動畫能夠調用AnimationDrawable的stop方法動畫

  imageView.setImageResource(R.drawable.lottery_animlist);
  AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); animationDrawable.stop();

3.)純Java代碼實現方式

複製代碼
AnimationDrawable anim = new AnimationDrawable(); for (int i = 1; i <= 6; i++) { int id = getResources().getIdentifier("lottery_" + i, "mipmap", getPackageName()); Drawable drawable = getResources().getDrawable(id); anim.addFrame(drawable, 200); } anim.setOneShot(false); imageView.setImageDrawable(anim); anim.start();
複製代碼

4.)AnimationDrawable 幾個常見的api

  • void start() - 開始播放動畫spa

  • void stop() - 中止播放動畫code

  • addFrame(Drawable frame, int duration) - 添加一幀,並設置該幀顯示的持續時間

  • void setOneShoe(boolean flag) - false爲循環播放,true爲僅播放一次

  • boolean isRunning() - 是否正在播放

總結:

   Frame Animation(逐幀動畫)相對來講比較簡單,可是在實際開發中使用的頻率仍是比較高的。但願以這個小例子可以掌握逐幀動畫,可是逐幀動畫只能實現比較小的動畫效果,若是複雜並且幀數比較多的動畫不太建議使用逐幀動畫,一方面是由於會形成OOM,另外一方面會顯得很卡,若是真是超級複雜的動畫的話建議選擇雙緩衝繪製View來實現。

相關文章
相關標籤/搜索