Android 動畫系列二 逐幀動畫(FrameAnimation)

一、概述

逐幀動畫是一種常見的動畫形式,其原來將動畫拆分為 幀 的形式,且定義每一幀 = 每一張圖片,按序播放一組預先定義好的圖片。

二、相關屬性

在Android中逐幀動畫需要得到AnimationDrawable類的支持是Drawable的間接子類。它主要用來創(chuàng)建一個逐幀動畫,并且可以對幀進行拉伸,把它設置為View的背景即可使用AnimationDrawable.start()方法播放。既然逐幀動畫是需要播放一幀一幀的圖像,所以需要為其添加幀。在Android中提供了兩種方式為AnimationDrawable添加幀:XML定義的資源文件和Java代碼創(chuàng)建,后面再詳細講講這兩種添加幀的方式。下面簡單介紹一下AnimationDrawable操作逐幀動畫常用方法:

java方法 說明
start() 開始播放逐幀動畫
stop() 停止播放逐幀動畫
addFrame(Drawable frame,int duration) 為AnimationDrawable添加一幀,并設置持續(xù)時間
int getDuration(int i) 得到指定index的幀的持續(xù)時間
Drawable getFrame(int index) 得到指定index的幀Drawable
int getNumberOfFrames() 得到當前AnimationDrawable的所有幀數(shù)量
boolean isOneShot() 當前AnimationDrawable是否執(zhí)行一次,返回true執(zhí)行一次,false循環(huán)播放
boolean isRunning() 當前AnimationDrawable是否正在播放
void setOneShot(boolean oneShot) 設置AnimationDrawable是否執(zhí)行一次,true執(zhí)行一次,false循環(huán)播放
xml 說明
android:oneshot true執(zhí)行一次,false循環(huán)播放默認false
android:duration 每幀播放的實際

三、使用方法

3-1 使用XML定義的資源文件設置動畫幀

Android下所有的資源文件均要放在/res目錄下,對于動畫幀的資源需要當成一個Drawable,所以需要把它放在/res/Drawable目錄下。而定義逐幀動畫非常簡單,只要在<animation-list.../>元素中使用<item.../>子元素定義動畫的全部幀,并制定各幀的持續(xù)時間即可。還可以在<animation-list.../>元素中添加屬性,來設定逐幀動畫的屬性。
代碼示例

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">//設置只播放一次,默認false
    <item android:drawable="@drawable/zf0" android:duration="200"/>
    <item android:drawable="@drawable/zf1" android:duration="200"/>
    <item android:drawable="@drawable/zf2" android:duration="200"/>
    <item android:drawable="@drawable/zf3" android:duration="200"/>
    <item android:drawable="@drawable/zf4" android:duration="200"/>
    <item android:drawable="@drawable/zf5" android:duration="200"/>
    <item android:drawable="@drawable/zf6" android:duration="200"/>
    <item android:drawable="@drawable/zf7" android:duration="200"/>
    <item android:drawable="@drawable/zf8" android:duration="200"/>
    <item android:drawable="@drawable/zf9" android:duration="200"/>
</animation-list>

java代碼中使用方法

//通過設置背景進行幀動畫播放
  TextView  tv_gy = findViewById(R.id.tv_gy);
   AnimationDrawable  gyDrawable = (AnimationDrawable) tv_gy.getBackground();
   gyDrawable.start();
//通過圖片設置
 ImageView iv_hz = findViewById(R.id.img_hz);
 iv_hz.setImageResource(R.drawable.hongzhong_anim);
 AnimationDrawable hzDrawable = (AnimationDrawable) iv_hz.getDrawable();
 hzDrawable.start();

3-2 使用Java代碼創(chuàng)建逐幀動畫

通過AnimationDrawable.addFrame()方法為AnimationDrawable添加動畫幀,上面已經(jīng)提供了addFrame()的方法簽名,它可以設置添加動畫幀的Drawable和持續(xù)時間
代碼示例

  AnimationDrawable zfDrawable = new AnimationDrawable();
                for (int i = 0; i <= 9; i++) {
                    int id = getResources().getIdentifier("zf" + i, "drawable", FrameAnimaActivity.this.getPackageName());
                    Drawable drawable = getResources().getDrawable(id);
                    zfDrawable.addFrame(drawable, 100);
                }
                btn_zf.setBackgroundDrawable(zfDrawable);
                zfDrawable.start();

四、特點

  • 優(yōu)點:使用簡單、方便
  • 缺點:容易引起 OOM,因為會使用大量 尺寸較大的圖片資源,所以一定要盡量避免使用尺寸較大的圖片

五、應用場景

較為復雜的個性化動畫效果
注意事項:使用時一定要避免使用尺寸較大的圖片,否則會引起OOM

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,109評論 25 709
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,025評論 2 59
  • 概述 在Android開發(fā)的過程中,View的變化是很常見的,如果View變化的過程沒有動畫來過渡而是瞬間完成,會...
    小蕓論閱讀 39,161評論 18 134
  • “ 每天進步一點點,堅持帶來大改變”。 回憶...
    楷子子閱讀 498評論 6 3
  • 事情回到外公去世準備下葬前一天晚上。 我們正準備吃飯,我一眼就看到外公從門外顫顫巍巍的走進來,半邊臉腐爛...
    小迷糊喲閱讀 1,010評論 7 2

友情鏈接更多精彩內(nèi)容