Android動畫使用(一)—— 幀動畫

特別提醒:本文參考摘自【工匠若水 http://blog.csdn.net/yanbober/article/details/46481171 】強烈建議讀者進入原博客查看學習。

1只磷、Android動畫簡介

1.1分類

Android系統(tǒng)提供了很多豐富的API去實現(xiàn)UI的2D與3D動畫泌绣,最主要的劃分可以分為如下幾類:

Drawable Animation: 這種動畫(也叫Frame動畫阿迈、幀動畫)其實可以劃分到視圖動畫的類別,專門用來一個一個的顯示Drawable的resources惠毁,就像放幻燈片一樣。

View Animation: 視圖動畫在古老的Android版本系統(tǒng)中就已經(jīng)提供了鞠绰,只能被用來設(shè)置View的動畫蜈膨。

**Property Animation: **屬性動畫只對Android 3.0(API 11)以上版本的Android系統(tǒng)才有效,這種動畫可以設(shè)置給任何Object驴一,包括那些還沒有渲染到屏幕上的對象灶壶。這種動畫是可擴展的,可以讓你自定義任何類型和屬性的動畫胸懈。

1.2每種動畫的特點及區(qū)別

Drawable Animation:幀動畫沒有什么好說的恰响,就是把幾張圖片按一定間隔順序顯示出來胚宦,就像播放幻燈片一樣,實際開發(fā)中用處不大枢劝。

View Animation:View動畫只能夠為View添加動畫您旁,如果想為非View對象添加動畫須自己實現(xiàn);且View動畫支持的種類很少军掂;尤其是他改變的是View的繪制效果昨悼,View的屬性沒有改變率触,其位置與大小都不變; View動畫代碼量少,使用簡單方便细燎。

**Property Animation: **屬性動畫彌補了View動畫的缺陷皂甘,可以為一個對象的任意屬性添加動畫偿枕,對象自己的屬性會被真的改變;當對象的屬性變化的時候嗤锉,屬性動畫會自動刷新屏幕墓塌;屬性動畫改變的是對象的真實屬性,而且屬性動畫不止用于View访诱,還可以用于任何對象态坦。

2伞梯、Drawable動畫詳細說明

2.1 實現(xiàn)方式

   方式一:java代碼實現(xiàn)
   方式二:xml文件實現(xiàn)

2.2 java代碼方式實現(xiàn)

演示效果說明:

點擊“開始”按鈕開始動畫帚屉,點擊“停止”按鈕停止動畫。

步驟1

將圖片資源文件放到drawable_xxx文件目錄下喻旷。

步驟2

activity_main.xml布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <Button
        android:onClick="startAnimation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="開始動畫"/>

    <Button
        android:onClick="stopAnimation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止動畫"/>

    <ImageView
        android:id="@+id/image"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

步驟3

java代碼邏輯MainActivity.java文件如下:

public class MainActivity extends AppCompatActivity {

    private AnimationDrawable animationDrawable;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.image);

        //創(chuàng)建幀動畫對象
        animationDrawable = new AnimationDrawable();

        //添加一幀圖片
        //參數(shù)二:間隔時間
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv01), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv02), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv03), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv04), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv05), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv06), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv07), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv08), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv09), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv10), 100);

        //設(shè)置ImageView的背景為幀動畫(因為幀動畫是Drawable的一個子類,可以直接設(shè)置)
        imageView.setBackground(animationDrawable);
    }

    /**
     * 開始動畫點擊事件
     */
    public void startAnimation(View view) {

        //設(shè)置是否循環(huán)播放(默認false)
        animationDrawable.setOneShot(false);

        //開始動畫
        animationDrawable.start();
        
    }

    /**
     * 停止動畫點擊事件
     */
    public void stopAnimation(View view) {

        //如果該動畫正在執(zhí)行锋谐,則停止動畫
        if (animationDrawable.isRunning()) {
            animationDrawable.stop();
        }
    }
}

2.3 XML文件方式實現(xiàn)

演示效果截酷、步驟1、步驟2同上文中的java方式三热。

步驟3

在res文件下創(chuàng)建drawable文件夾(注意,一定是drawable這個文件夾名)呐能;

創(chuàng)建資源文件drawable_animation.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--指定條目圖片資源以及間隔時間-->
    <item android:drawable="@drawable/iv01" android:duration="200"></item>
    <item android:drawable="@drawable/iv02" android:duration="200"></item>
    <item android:drawable="@drawable/iv03" android:duration="200"></item>
    <item android:drawable="@drawable/iv04" android:duration="200"></item>
    <item android:drawable="@drawable/iv05" android:duration="200"></item>
    <item android:drawable="@drawable/iv06" android:duration="200"></item>
    <item android:drawable="@drawable/iv07" android:duration="200"></item>
    <item android:drawable="@drawable/iv08" android:duration="200"></item>
    <item android:drawable="@drawable/iv08" android:duration="200"></item>
    <item android:drawable="@drawable/iv10" android:duration="200"></item>
</animation-list>

步驟4

java代碼邏輯MainActivity.java文件如下:

public class MainActivity extends AppCompatActivity {

    private AnimationDrawable animationDrawable;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.image);

        //不通過new得到對象通過下面這種方式得到對象
        animationDrawable= (AnimationDrawable) getResources().getDrawable(R.drawable.drawable_animation);

        //設(shè)置ImageView的背景為幀動畫(因為幀動畫是Drawable的一個子類催跪,可以直接設(shè)置)
        imageView.setBackground(animationDrawable);

    }

    /**
     * 開始動畫點擊事件
     */
    public void startAnimation(View view) {

        //設(shè)置是否循環(huán)播放(默認false)
        animationDrawable.setOneShot(false);

        //開始動畫
        animationDrawable.start();

    }

    /**
     * 停止動畫點擊事件
     */
    public void stopAnimation(View view) {

        //如果該動畫正在執(zhí)行懊蒸,則停止動畫
        if (animationDrawable.isRunning()) {
            animationDrawable.stop();
        }
    }
}

3悯搔、特別提醒

當用xml方式實現(xiàn)時妒貌,AnimationDrawable的start()方法最好別在Activity的onCreate方法中調(diào)運,因為AnimationDrawable還未完全附著到window上灌曙,所以最好的調(diào)運時機是onWindowFocusChanged()方法中在刺。

4、總結(jié)

以上就是幀動畫的基本實現(xiàn)魄幕,由于該動畫的局限性颖杏,實際開發(fā)中很少有用到,掌握上文中所描述的翼抠,就基本能應(yīng)付實際開發(fā)中的應(yīng)用場景了获讳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赔嚎,一起剝皮案震驚了整個濱河市胧弛,隨后出現(xiàn)的幾起案子侠畔,更是在濱河造成了極大的恐慌软棺,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茵宪,死亡現(xiàn)場離奇詭異瘦棋,居然都是意外死亡,警方通過查閱死者的電腦和手機凰狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門赡若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來团甲,“玉大人躺苦,你說我怎么就攤上這事』恚” “怎么了集乔?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵坡椒,是天一觀的道長倔叼。 經(jīng)常有香客問我,道長丈攒,這世上最難降的妖魔是什么授霸? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任碘耳,我火速辦了婚禮框弛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘广匙。我一直安慰自己,他們只是感情好僻焚,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布溅呢。 她就那樣靜靜地躺著猿挚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铣墨。 梳的紋絲不亂的頭發(fā)上办绝,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天孕蝉,我揣著相機與錄音,去河邊找鬼超埋。 笑死佳鳖,一個胖子當著我的面吹牛霍殴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播系吩,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼来庭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穿挨?” 一聲冷哼從身側(cè)響起月弛,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肴盏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帽衙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叁鉴,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佛寿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年幌墓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀泻。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡常侣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弹渔,到底是詐尸還是另有隱情胳施,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布肢专,位于F島的核電站舞肆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏博杖。R本人自食惡果不足惜椿胯,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剃根。 院中可真熱鬧哩盲,春花似錦、人聲如沸狈醉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苗傅。三九已至抒线,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渣慕,已是汗流浹背嘶炭。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摇庙,地道東北人旱物。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓遥缕,卻偏偏與公主長得像卫袒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子单匣,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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