一、概述
逐幀動畫是一種常見的動畫形式,其原來將動畫拆分為 幀 的形式,且定義每一幀 = 每一張圖片,按序播放一組預先定義好的圖片。
二、相關屬性
在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