前言
作為 Android 最常見的兩種動畫形式,逐幀動畫( Drawable 動畫),有着極其廣泛的應用,它的原理與早起的電影以及 GIF 類似,就是把一張的圖,按順序快速切換,這樣一來看上去就好像會動一樣。
實例,大家先看看效果
大家明顯可以看到這是一個動圖,但是它並非一個 GIF 它是由八張單獨的圖片,間隔 200ms 連續播放所實現的效果。
實現方法
這里我給大家介紹兩種實現方法
- 在活動代碼中添加實現
- 先生成 animation-list 的資源文件,再在活動中引用。
在代碼中添加
在代碼中添加顧名思義,就是將要播放的圖片集合,一張一張的添加到一個 AnimationDrawable 對象中去,接着再將其添加到 imageView 中,調用 start() 方法便能開始播放。
注意:這里有個 OneShot() 方法,該方法用於設置是否需要循環播放,true為僅播放一次,false 為連續的循環播放。
引用資源文件方法
方法一有一個很嚴重的缺陷,就是每次要給控件添加這個動畫時,都需要重新一步步的添加,但是有的時候,一套動畫,我們可能需要在很多地方反復的使用到。
這時如果我們采用,將動畫封裝在一個資源文件中,在需要使用的時候能夠像添加背景圖一樣簡單的添加它:
步驟
- 在 /res/drawable 文件夾下建立一個名為 abunation_list.xml 的文件
- 在活動代碼中,像添加圖片資源一樣的,為控件添加它
- 通過 getDrawable 方法,重空間中獲得它並添加給 AnimationDrawable 對象
- 調用 start 方法開啟動畫
建立資源文件如下
將其添加到 ImageView 中
注意事項
在使用幀動畫時,這里有幾個要點需要大家記住:
其一、在我的范例代碼中,大家可以看到,是直接在 imageView 對象執行過 findViewById 后就添加了的,但是這樣會導致一個嚴重的問題,對於一些手機而言,如果 onCreate 方法沒有執行完,imageView 對象就不會真正的實例化出來,這就到導致空指針異常(NullPointException)。正確的使用方法,根據活動的運行周期,我們應該在 onResume 方法中添加它,這樣就保證了所有的控件都被實例化出來,
其二、對與幀動畫,我們不建議添加太大的圖片,因為這很容易導致 OOM,建議大家用 Drawable 動畫,去做一些類似,加載動畫,WiFi 鏈接動畫這樣,占有內存比較小的操作。
項目 Demo :
由於以上都是我自己的理解,如果有誤,歡迎大家在評論區留言,謝謝 🙏