Android 3.0 之前的版本,我們能使用的動(dòng)畫(huà)類(lèi)型有兩種,分別是逐幀動(dòng)畫(huà)和補(bǔ)幀動(dòng)畫(huà);在 Android 3.0 發(fā)布時(shí),Android SDK 又引入了更加強(qiáng)大靈活的屬性動(dòng)畫(huà),使得復(fù)雜動(dòng)畫(huà)效果更加容易實(shí)現(xiàn);Android 4.4 中,Android SDK 又帶來(lái)了 android.transition 框架,可以以更直觀的方式定義動(dòng)畫(huà)效果。
逐幀動(dòng)畫(huà)
逐幀動(dòng)畫(huà)(Frame Animation),是最簡(jiǎn)單最直觀的動(dòng)畫(huà)類(lèi)型,它利用人眼的視覺(jué)暫留效應(yīng) ---- 也就是光對(duì)視網(wǎng)膜所產(chǎn)生視覺(jué)在光停止動(dòng)作后,仍然保留一段時(shí)間的現(xiàn)象。
開(kāi)發(fā)者指定動(dòng)畫(huà)中每一幀對(duì)應(yīng)的圖片和持續(xù)時(shí)間,就可以開(kāi)始播放動(dòng)畫(huà)。定義逐幀動(dòng)畫(huà),可以采用 XML 資源文件或者代碼實(shí)現(xiàn)。
1. XML 資源文件方式
新建一個(gè)動(dòng)畫(huà) XML 文件,在文件中使用 <animation-list> 標(biāo)簽來(lái)定義動(dòng)畫(huà)幀序列,使用 <item> 標(biāo)簽來(lái)定義動(dòng)畫(huà)的每一幀,并在其中指定幀的持續(xù)時(shí)間等屬性。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/img00"
android:duration="120" />
<item
android:drawable="@mipmap/img01"
android:duration="120" />
<item
android:drawable="@mipmap/img02"
android:duration="120" />
<item
android:drawable="@mipmap/img03"
android:duration="120" />
<item
android:drawable="@mipmap/img04"
android:duration="120" />
<item
android:drawable="@mipmap/img05"
android:duration="120" />
<item
android:drawable="@mipmap/img06"
android:duration="120" />
<item
android:drawable="@mipmap/img07"
android:duration="120" />
<item
android:drawable="@mipmap/img08"
android:duration="120" />
<item
android:drawable="@mipmap/img10"
android:duration="120" />
<item
android:drawable="@mipmap/img11"
android:duration="120" />
<item
android:drawable="@mipmap/img12"
android:duration="120" />
<item
android:drawable="@mipmap/img13"
android:duration="120" />
<item
android:drawable="@mipmap/img14"
android:duration="120" />
<item
android:drawable="@mipmap/img15"
android:duration="120" />
<item
android:drawable="@mipmap/img16"
android:duration="120" />
<item
android:drawable="@mipmap/img17"
android:duration="120" />
<item
android:drawable="@mipmap/img18"
android:duration="120" />
<item
android:drawable="@mipmap/img19"
android:duration="120" />
<item
android:drawable="@mipmap/img20"
android:duration="120" />
<item
android:drawable="@mipmap/img21"
android:duration="120" />
<item
android:drawable="@mipmap/img22"
android:duration="120" />
<item
android:drawable="@mipmap/img23"
android:duration="120" />
<item
android:drawable="@mipmap/img24"
android:duration="120" />
</animation-list>
oneshot 用來(lái)控制動(dòng)畫(huà)是否循環(huán)播放,如果取值為 true,表示動(dòng)畫(huà)不會(huì)循環(huán)播放,否則動(dòng)畫(huà)會(huì)循環(huán)播放;duration 用來(lái)指定每一幀的持續(xù)播放時(shí)間。
使用
ivFrameXML.setImageResource(R.drawable.animation);
AnimationDrawable anim = (AnimationDrawable) ivFrameXML.getDrawable();
anim.start();
2. 代碼方式
AnimationDrawable animationDrawable = new AnimationDrawable();
int id = 0;
for (int i = 0; i < 24; i++) {
if (i < 10) {
id = getResources().getIdentifier("img0" + i, "mipmap", getPackageName());
} else {
id = getResources().getIdentifier("img" + i, "mipmap", getPackageName());
}
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable, 120);
}
ivFrameCode.setImageDrawable(animationDrawable);
animationDrawable.setOneShot(false);
animationDrawable.start();
實(shí)現(xiàn)效果

幀動(dòng)畫(huà)使用比較簡(jiǎn)單,但是容易引起 OOM,在使用幀動(dòng)畫(huà)時(shí)應(yīng)該盡量避免使用過(guò)多尺寸較大的圖片。