一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

詳解Android動畫之Frame Animation

 univasity 2011-12-20

在開始實例講解之前,先引用官方文檔中的一段話:

Frame動畫是一系列圖片按照一定的順序展示的過程,和放電影的機(jī)制很相似,我們稱為逐幀動畫。Frame動畫可以被定義在XML文件中,也可以完全編碼實現(xiàn)。

如果被定義在XML文件中,我們可以放置在/res下的anim或drawable目錄中(/res/[anim | drawable]/filename.xml),文件名可以作為資源ID在代碼中引用;如果由完全由編碼實現(xiàn),我們需要使用到 AnimationDrawable對象。

如果是將動畫定義在XML文件中的話,語法如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas./apk/res/android"  
  3.     android:oneshot=["true" | "false"] >  
  4.     <item  
  5.         android:drawable="@[package:]drawable/drawable_resource_name"  
  6.         android:duration="integer" />  
  7. </animation-list>  

需要注意的是:

<animation-list>元素是必須的,并且必須要作為根元素,可以包含一或多個<item>元素;android:onshot如果定義為true的話,此動畫只會執(zhí)行一次,如果為false則一直循環(huán)。

<item>元素代表一幀動畫,android:drawable指定此幀動畫所對應(yīng)的圖片資源,android:druation代表此幀持續(xù)的時間,整數(shù),單位為毫秒。

文檔接下來的示例我就不在解說了,因為接下來我們也要結(jié)合自己的實例演示一下這個過程。

我們新建一個名為anim的工程,將四張連續(xù)的圖片分別命名為f1.png,f2.png,f3.png,f4.png,放于drawable目錄,然后新建一個frame.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas./apk/res/android"  
  3.     android:oneshot="false">  
  4.     <item android:drawable="@drawable/f1" android:duration="300" />  
  5.     <item android:drawable="@drawable/f2" android:duration="300" />  
  6.     <item android:drawable="@drawable/f3" android:duration="300" />  
  7.     <item android:drawable="@drawable/f4" android:duration="300" />  
  8. </animation-list>  
我們可以將frame.xml文件放置于drawable或anim目錄,官方文檔上是放到了drawable中了,大家可以根據(jù)喜好來放置,放在這兩個目錄都是可以運行的。

然后介紹一下布局文件res/layout/frame.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas./apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="fill_parent"  
  6.   android:layout_height="fill_parent">  
  7.   <ImageView  
  8.     android:id="@+id/frame_image"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent"  
  11.     android:layout_weight="1"/>  
  12.   <Button  
  13.     android:layout_width="fill_parent"  
  14.     android:layout_height="wrap_content"  
  15.     android:text="stopFrame"  
  16.     android:onClick="stopFrame"/>  
  17.   <Button  
  18.     android:layout_width="fill_parent"  
  19.     android:layout_height="wrap_content"  
  20.     android:text="runFrame"  
  21.     android:onClick="runFrame"/>  
  22. </LinearLayout>  
我們定義了一個ImageView作為動畫的載體,然后定義了兩個按鈕,分別是停止和啟動動畫。

接下來介紹一下如何通過加載動畫定義文件來實現(xiàn)動畫的效果。我們首先會這樣寫:

  1. package com.scott.anim;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.ImageView;  
  9.   
  10. public class FrameActivity extends Activity {  
  11.       
  12.     private ImageView image;  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.frame);  
  18.         image = (ImageView) findViewById(R.id.frame_image);  
  19.           
  20.         image.setBackgroundResource(R.anim.frame);  
  21.         AnimationDrawable anim = (AnimationDrawable) image.getBackground();  
  22.         anim.start();  
  23.     }  
  24. }  
看 似十分完美,跟官方文檔上寫的一樣,然而當(dāng)我們運行這個程序時會發(fā)現(xiàn),它只停留在第一幀,并沒有出現(xiàn)我們期望的動畫,也許你會失望的說一 句:“Why?”,然后你把相應(yīng)的代碼放在一個按鈕的點擊事件中,動畫就順利執(zhí)行了,再移回到onCreate中,還是沒效果,這個時候估計你會氣急敗壞 的吼一句:“What the fuck!”。但是,什么原因呢?如何解決呢?

出現(xiàn)這種現(xiàn)象是因為當(dāng)我們在onCreate中調(diào)用AnimationDrawable的start方法時,窗口Window對象還沒有完全初始 化,AnimationDrawable不能完全追加到窗口Window對象中,那么該怎么辦呢?我們需要把這段代碼放在 onWindowFocusChanged方法中,當(dāng)Activity展示給用戶時,onWindowFocusChanged方法就會被調(diào)用,我們正是 在這個時候?qū)崿F(xiàn)我們的動畫效果。當(dāng)然,onWindowFocusChanged是在onCreate之后被調(diào)用的,如圖:


然后我們需要重寫一下代碼:

  1. package com.scott.anim;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.ImageView;  
  9.   
  10. public class FrameActivity extends Activity {  
  11.       
  12.     private ImageView image;  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.frame);  
  18.         image = (ImageView) findViewById(R.id.frame_image);  
  19.     }  
  20.       
  21.     @Override  
  22.     public void onWindowFocusChanged(boolean hasFocus) {  
  23.         super.onWindowFocusChanged(hasFocus);  
  24.         image.setBackgroundResource(R.anim.frame);  
  25.         AnimationDrawable anim = (AnimationDrawable) image.getBackground();  
  26.         anim.start();  
  27.     }  
  28. }  
運行一下,動畫就可以正常顯示了。

如果在有些場合,我們需要用純代碼方式實現(xiàn)一個動畫,我們可以這樣寫:

  1. AnimationDrawable anim = new AnimationDrawable();  
  2. for (int i = 1; i <= 4; i++) {  
  3.     int id = getResources().getIdentifier("f" + i, "drawable", getPackageName());  
  4.     Drawable drawable = getResources().getDrawable(id);  
  5.     anim.addFrame(drawable, 300);  
  6. }  
  7. anim.setOneShot(false);  
  8. image.setBackgroundDrawable(anim);  
  9. anim.start();  
完整的FrameActivity.java代碼如下:

  1. package com.scott.anim;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.ImageView;  
  9.   
  10. public class FrameActivity extends Activity {  
  11.       
  12.     private ImageView image;  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.frame);  
  18.         image = (ImageView) findViewById(R.id.frame_image);  
  19.     }  
  20.       
  21.     @Override  
  22.     public void onWindowFocusChanged(boolean hasFocus) {  
  23.         super.onWindowFocusChanged(hasFocus);  
  24.         image.setBackgroundResource(R.anim.frame);  //將動畫資源文件設(shè)置為ImageView的背景  
  25.         AnimationDrawable anim = (AnimationDrawable) image.getBackground(); //獲取ImageView背景,此時已被編譯成AnimationDrawable  
  26.         anim.start();   //開始動畫  
  27.     }  
  28.       
  29.     public void stopFrame(View view) {  
  30.         AnimationDrawable anim = (AnimationDrawable) image.getBackground();  
  31.         if (anim.isRunning()) { //如果正在運行,就停止  
  32.             anim.stop();  
  33.         }  
  34.     }  
  35.       
  36.     public void runFrame(View view) {  
  37.         //完全編碼實現(xiàn)的動畫效果  
  38.         AnimationDrawable anim = new AnimationDrawable();  
  39.         for (int i = 1; i <= 4; i++) {  
  40.             //根據(jù)資源名稱和目錄獲取R.java中對應(yīng)的資源ID  
  41.             int id = getResources().getIdentifier("f" + i, "drawable", getPackageName());  
  42.             //根據(jù)資源ID獲取到Drawable對象  
  43.             Drawable drawable = getResources().getDrawable(id);  
  44.             //將此幀添加到AnimationDrawable中  
  45.             anim.addFrame(drawable, 300);  
  46.         }  
  47.         anim.setOneShot(false); //設(shè)置為loop  
  48.         image.setBackgroundDrawable(anim);  //將動畫設(shè)置為ImageView背景  
  49.         anim.start();   //開始動畫  
  50.     }  
  51. }  
好,先到這里,謝謝大家。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文字幕亚洲精品人妻| 好吊妞视频免费在线观看| 国产精品第一香蕉视频| 国内尹人香蕉综合在线| 国产精品白丝一区二区| 国产日韩中文视频一区| 日本加勒比中文在线观看| 国产一区二区精品高清免费| 亚洲精品偷拍一区二区三区| 精品少妇人妻av免费看| 热情的邻居在线中文字幕| 国产一区二区三区四区中文| 亚洲av秘片一区二区三区| 厕所偷拍一区二区三区视频| 免费大片黄在线观看日本| 五月婷婷欧美中文字幕| 99久只有精品免费视频播放| 好吊一区二区三区在线看| 国产av大片一区二区三区| 日韩一区二区三区久久| 欧美区一区二区在线观看| 午夜精品一区免费视频| 欧美午夜不卡在线观看| 污污黄黄的成年亚洲毛片| 国内精品一区二区欧美| 日本一本不卡免费视频| 最近日韩在线免费黄片| 精品少妇人妻av一区二区蜜桃 | 国产黄色高清内射熟女视频| 激情视频在线视频在线视频| 欧美日韩亚洲国产精品| 中字幕一区二区三区久久蜜桃| 国产精品99一区二区三区| 偷拍洗澡一区二区三区| 日本欧美一区二区三区高清| 亚洲中文字幕乱码亚洲| 欧美日韩精品一区免费| 激情国产白嫩美女在线观看| 99热九九在线中文字幕| 精品少妇一区二区视频| 蜜桃传媒视频麻豆第一区|