Carson帶你Android:關(guān)于逐幀動(dòng)畫的知識(shí)都在這里了!


前言

  • 動(dòng)畫的使用 是 Android 開發(fā)中常用的知識(shí)
  • 可是動(dòng)畫的種類繁多、使用復(fù)雜,每當(dāng)需要 采用自定義動(dòng)畫 實(shí)現(xiàn) 復(fù)雜的動(dòng)畫效果時(shí),很多開發(fā)者就顯得束手無策
  • 本文將詳細(xì)介紹 Android 動(dòng)畫中 逐幀動(dòng)畫的原理 & 使用
    動(dòng)畫類型

Carson帶你學(xué)Android動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份詳細(xì)&全面的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))


目錄

目錄

1. 作用對(duì)象

視圖控件(View

  1. AndroidTextView、Button等等
  2. 不可作用于View組件的屬性,如:顏色、背景、長度等等

2. 原理

將動(dòng)畫拆分為幀的形式,且定義每一幀等于每一張圖片,最后按序播放一組預(yù)先定義好的圖片。


3. 具體使用

實(shí)例效果如下:


效果圖

具體使用步驟如下:

// 步驟1:將動(dòng)畫資源(即每張圖片資源)放到 drawable文件夾里
// 技巧:找到自己需要的gif動(dòng)畫,用 gif分解軟件(如 GifSplitter)將 gif 分解成一張張圖片即可

// 步驟2:設(shè)置、啟動(dòng)動(dòng)畫
// 分兩種方式:xml跟java

 // 方式1:xml
   // 1. 在 res/drawable的文件夾里創(chuàng)建動(dòng)畫效果.xml文件 - knight_attack.xml
   <?xml version="1.0" encoding="utf-8"?>
    <animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="true" // 設(shè)置是否只播放一次,默認(rèn)為false
        >

    // item = 動(dòng)畫圖片資源;duration = 設(shè)置一幀持續(xù)時(shí)間(ms)
        <item android:drawable="@drawable/a0" android:duration="100"/>
        <item android:drawable="@drawable/a1" android:duration="100"/>
        <item android:drawable="@drawable/a2" android:duration="100"/>
        <item android:drawable="@drawable/a3" android:duration="100"/>
        <item android:drawable="@drawable/a4" android:duration="100"/>
        <item android:drawable="@drawable/a5" android:duration="100"/>
        <item android:drawable="@drawable/a6" android:duration="100"/>
        <item android:drawable="@drawable/a7" android:duration="100"/>
        <item android:drawable="@drawable/a8" android:duration="100"/>
        <item android:drawable="@drawable/a9" android:duration="100"/>
        <item android:drawable="@drawable/a10" android:duration="100"/>
        <item android:drawable="@drawable/a11" android:duration="100"/>
        <item android:drawable="@drawable/a12" android:duration="100"/>
        <item android:drawable="@drawable/a13" android:duration="100"/>
        <item android:drawable="@drawable/a14" android:duration="100"/>
        <item android:drawable="@drawable/a15" android:duration="100"/>
        <item android:drawable="@drawable/a16" android:duration="100"/>
        <item android:drawable="@drawable/a17" android:duration="100"/>
        <item android:drawable="@drawable/a18" android:duration="100"/>
        <item android:drawable="@drawable/a19" android:duration="100"/>
        <item android:drawable="@drawable/a20" android:duration="100"/>
        <item android:drawable="@drawable/a21" android:duration="100"/>
        <item android:drawable="@drawable/a22" android:duration="100"/>
        <item android:drawable="@drawable/a23" android:duration="100"/>
        <item android:drawable="@drawable/a24" android:duration="100"/>
        <item android:drawable="@drawable/a25" android:duration="100"/>
    </animation-list>

    // 2. 載入 & 啟動(dòng)動(dòng)畫
    public class FrameActivity extends AppCompatActivity {
        private Button btn_startFrame,btn_stopFrame;
        private ImageView iv;
        private AnimationDrawable animationDrawable;

            iv = (ImageView) findViewById(R.id.iv);
            btn_startFrame = (Button) findViewById(R.id.btn_startFrame);
            btn_stopFrame = (Button) findViewById(R.id.btn_stopFrame);


            // 載入動(dòng)畫
            btn_startFrame.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // 1. 設(shè)置動(dòng)畫
                    iv.setImageResource(R.drawable.knight_attack);
                    // 2. 獲取動(dòng)畫對(duì)象
                    animationDrawable = (AnimationDrawable) iv.getDrawable();
                    // 3. 啟動(dòng)動(dòng)畫
                    animationDrawable.start();
                    
                }
            });

            // 停止動(dòng)畫
            btn_stopFrame.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    
                    // 1. 設(shè)置動(dòng)畫
                    iv.setImageResource(R.drawable.knight_attack);
                    // 2. 獲取動(dòng)畫對(duì)象
                    animationDrawable = (AnimationDrawable) iv.getDrawable();
                    // 3. 暫停動(dòng)畫
                    animationDrawable.stop();
                }
            });

        }
    }
     // 方式2:java
        // 直接從drawable文件夾獲取動(dòng)畫資源(圖片)
        animationDrawable = new AnimationDrawable();
        for (int i = 0; i <= 25; i++) {
            int id = getResources().getIdentifier("a" + i, "drawable", getPackageName());
            Drawable drawable = getResources().getDrawable(id);
            animationDrawable.addFrame(drawable, 100);
        }

        // 載入動(dòng)畫
        btn_startFrame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 1. 獲取資源對(duì)象
                iv.setImageDrawable(animationDrawable);
                // 2. 停止動(dòng)畫
                // 特別注意:在動(dòng)畫start()之前要先stop(),不然在第一次動(dòng)畫之后會(huì)停在最后一幀,這樣動(dòng)畫就只會(huì)觸發(fā)一次
                animationDrawable.stop();
                // 3. 啟動(dòng)動(dòng)畫
                animationDrawable.start();
            }
        });

        // 停止動(dòng)畫
        btn_stopFrame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1. 獲取資源對(duì)象
                iv.setImageDrawable(animationDrawable);
                // 2. 停止動(dòng)畫
                animationDrawable.stop();
            }
        });

4. 特點(diǎn)

  • 優(yōu)點(diǎn):使用簡單、方便
  • 缺點(diǎn):容易引起 OOM,因?yàn)闀?huì)使用大量 & 尺寸較大的圖片資源

盡量避免使用尺寸較大的圖片


5. 應(yīng)用場景

較為復(fù)雜的個(gè)性化動(dòng)畫效果。

使用時(shí)一定要避免使用尺寸較大的圖片,否則會(huì)引起OOM


6. 總結(jié)


歡迎關(guān)注Carson_Ho的簡書

不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度


請點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,530評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,759評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,204評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,415評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,955評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,675評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容