Android 逐幀動畫( Drawable 動畫),這一篇就夠了

前言

做爲 Android 最多見的兩種動畫形式,逐幀動畫( Drawable 動畫),有着極其普遍的應用,它的原理與早起的電影以及 GIF 相似,就是把一張的圖,按順序快速切換,這樣一來看上去就好像會動同樣。android

實例,你們先看看效果

你們明顯能夠看到這是一個動圖,可是它並不是一個 GIF 它是由八張單獨的圖片,間隔 200ms 連續播放所實現的效果。git

實現方法

這裏我給你們介紹兩種實現方法github

  1. 在活動代碼中添加實現
  2. 先生成 animation-list 的資源文件,再在活動中引用。

在代碼中添加

在代碼中添加顧名思義,就是將要播放的圖片集合,一張一張的添加到一個 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

這時若是咱們採用,將動畫封裝在一個資源文件中,在須要使用的時候可以像添加背景圖同樣簡單的添加它:指針

步驟

  1. 在 /res/drawable 文件夾下創建一個名爲 abunation_list.xml 的文件
  2. 在活動代碼中,像添加圖片資源同樣的,爲控件添加它
  3. 經過 getDrawable 方法,重空間中得到它並添加給 AnimationDrawable 對象
  4. 調用 start 方法開啓動畫

創建資源文件以下

<?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 中

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

項目 Demo :

點擊跳轉

因爲以上都是我本身的理解,若是有誤,歡迎你們在評論區留言,謝謝 🙏

相關文章
相關標籤/搜索