做爲 Android 最多見的兩種動畫形式,逐幀動畫( Drawable 動畫),有着極其普遍的應用,它的原理與早起的電影以及 GIF 相似,就是把一張的圖,按順序快速切換,這樣一來看上去就好像會動同樣。android
你們明顯能夠看到這是一個動圖,可是它並不是一個 GIF 它是由八張單獨的圖片,間隔 200ms 連續播放所實現的效果。git
這裏我給你們介紹兩種實現方法github
在代碼中添加顧名思義,就是將要播放的圖片集合,一張一張的添加到一個 AnimationDrawable 對象中去,接着再將其添加到 imageView 中,調用 start() 方法便能開始播放。bash
注意:這裏有個 OneShot() 方法,該方法用於設置是否須要循環播放,true爲僅播放一次,false 爲連續的循環播放。動畫
imageView_2 = findViewById(R.id.image_2);
AnimationDrawable animationDrawable1 = new AnimationDrawable();
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_1 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_2 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_3 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_4 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_5 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_6 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_7 ),200);
animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_8 ),200);
animationDrawable1.setOneShot(true);
imageView_2.setImageDrawable(animationDrawable1);
animationDrawable1.start();複製代碼
方法一有一個很嚴重的缺陷,就是每次要給控件添加這個動畫時,都須要從新一步步的添加,可是有的時候,一套動畫,咱們可能須要在不少地方反覆的使用到。spa
這時若是咱們採用,將動畫封裝在一個資源文件中,在須要使用的時候可以像添加背景圖同樣簡單的添加它:指針
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@drawable/iron_1"
android:duration="200"/>
<item
android:drawable="@drawable/iron_2"
android:duration="200"/>
<item
android:drawable="@drawable/iron_3"
android:duration="200"/>
<item
android:drawable="@drawable/iron_4"
android:duration="200"/>
<item
android:drawable="@drawable/iron_5"
android:duration="200"/>
<item
android:drawable="@drawable/iron_6"
android:duration="200"/>
<item
android:drawable="@drawable/iron_7"
android:duration="200"/>
<item
android:drawable="@drawable/iron_8"
android:duration="200"/>
</animation-list>
複製代碼
imageView_1 = findViewById(R.id.image_1);
imageView_1.setImageResource(R.drawable.abunation_list);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView_1.getDrawable();
animationDrawable.start();複製代碼
在使用幀動畫時,這裏有幾個要點須要你們記住:code
其1、在個人範例代碼中,你們能夠看到,是直接在 imageView 對象執行過 findViewById 後就添加了的,可是這樣會致使一個嚴重的問題,對於一些手機而言,若是 onCreate 方法沒有執行完,imageView 對象就不會真正的實例化出來,這就到致使空指針異常(NullPointException)。正確的使用方法,根據活動的運行週期,咱們應該在 onResume 方法中添加它,這樣就保證了全部的控件都被實例化出來,cdn
其2、對與幀動畫,咱們不建議添加太大的圖片,由於這很容易致使 OOM,建議你們用 Drawable 動畫,去作一些相似,加載動畫,WiFi 連接動畫這樣,佔有內存比較小的操做。xml
因爲以上都是我本身的理解,若是有誤,歡迎你們在評論區留言,謝謝 🙏