Android 逐幀動(dòng)畫(huà)

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)效果

實(shí)現(xiàn)效果.gif

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

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

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

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