Android顯示GIF動畫的幾種方法

參考:

http://www.eoeandroid.com/thread-184872-1-1.html

http://blog.csdn.net/louiswangbing/article/details/6606933

http://stackoverflow.com/questions/15733749/read-gif-images-using-webview-android

http://stackoverflow.com/questions/3660209/display-animated-gif

http://stackoverflow.com/questions/4825383/gif-image-display-using-webview

臨時參考,回頭再整理 ;


1.通過開源項目GifView

主頁:http://code.google.com/p/gifview/
下載:http://code.google.com/p/gifview/downloads/list
簡介:android中現在沒有直接顯示gif的view,只能通過mediaplay來顯示,且還常常不能正常顯示出來,爲此寫了這個gifview,其用法和imageview一樣,支持gif圖片


使用方法:
1-把GifView.jar加入你的項目。
2-在xml中配置GifView的基本屬性,GifView繼承自View類,和Button、ImageView一樣是一個UI控件。如:
<com.ant.liao.GifView android:id="@+id/gif2"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />
3-在代碼中配置常用屬性:
// 從xml中得到GifView的句柄
gf1 = (GifView) findViewById(R.id.gif1);
// 設置Gif圖片源
gf1.setGifImage(R.drawable.gif1);
// 添加監聽器
gf1.setOnClickListener(this);
// 設置顯示的大小,拉伸或者壓縮
gf1.setShowDimension(300, 300);
// 設置加載方式:先加載後顯示、邊加載邊顯示、只顯示第一幀再顯示
gf1.setGifImageType(GifImageType.COVER);
GifView的Jar包共有四個類
GifAction.java 觀察者類,監視GIF是否加載成功
GifFrame.java 裏面三個成員:當前圖片、延時、下張Frame的鏈接。
GifDecoder.java 解碼線程類
GifView.java 主類,包括常用方法,如GifView構造方法、設置圖片源、延遲、繪製等。


另外,發一個做過優化的鏈接:
http://phenom.iteye.com/blog/1308835

2.通過動畫
請參考:http://www.cnblogs.com/TerryBlog/archive/2010/09/06/1819641.html

/************************************************************************/
3.
Android動畫背景圖自動播放的實現
我們在開發android應用的時候,經常會遇到類似從網絡加載大圖,在加載的過程中,在圖片要顯示的ImageView位置,先顯示一個轉圈的loading動畫圖,給用戶的體驗會更好一些,要實現這個動畫圖很簡單,使用在/res/anim中定義xml的方式,通常使用…. 來實現。 例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"  
xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:duration="100" android:drawable="@drawable/loading_1" />  
  <item android:duration="100" android:drawable="@drawable/loading_2" />  
  <item android:duration="100" android:drawable="@drawable/loading_3" />  
  <item android:duration="100" android:drawable="@drawable/loading_4" />  
  <item android:duration="100" android:drawable="@drawable/loading_5" />  
  <item android:duration="100" android:drawable="@drawable/loading_6" />  
  <item android:duration="100" android:drawable="@drawable/loading_7" />  
  <item android:duration="100" android:drawable="@drawable/loading_8" />  
  <item android:duration="100" android:drawable="@drawable/loading_9" />  
  <item android:duration="100" android:drawable="@drawable/loading_10" />  
  <item android:duration="100" android:drawable="@drawable/loading_11" />  
  <item android:duration="100" android:drawable="@drawable/loading_12" />  
</animation-list>   

不過大多數朋友都會遇到的問題是,動畫是做好了,但是界面在加載的時候,動畫並不會自動播放,還得通過屏幕點擊等事件來觸發,這就失去了意義了,實際上,android的動畫AnimationDrawable 組件裏面有個start()方法用於啓動動畫播放,但是這個方法不能直接寫在onClick,onStart,onResume裏面,寫進去也是無效的,無法啓動動畫,只能寫在比如事件監聽當中,於是我們可以使用點小技巧來實現自動播放
目前我知道的有三種方法:

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

方法一:使用Runnalbe()來加載
imageView.setBackgroundResource(R.anim.xxxxx);
final AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();
imageView.post(new Runnable() {
    @
Override
        
public void run()  {
            
animationDrawable.start();
        
}
});

注意:此處一定要用getBackground();不能用getdrawable()方法,會沒效果。原因如下:

由於我們使用的是imageView的setBackgroundResource方法設置的資源背景,相當於佈局文件中的android:background屬性,這個屬性是view類的屬性,必須通過getBackground()方法來獲取;而getdrawable()是imageview類的方法,必須通過在代碼中setImageResource(int)(對應佈局文件的android:src)setImageDrawable(Drawable drawable)方法設置纔可以使用getdrawable()方法。
(詳情參考帖子:http://www.eoeandroid.com/forum. ... 1&extra=#pid1627412

方法二:使用AsyncTask異步加載啓動
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
RunAnim runAnim=new RunAnim();
runAnim.execute("");

class RunAnim extends AsyncTask<String, String, String> {
        @
Override
        
protected String doInBackground(String... params) {
            
if (!animationDrawable.isRunning()) {
               
animationDrawable.stop();
               
animationDrawable.start();
            
}
            
return "";
        
}
}

方法三:通過添加addOnPreDrawListener來自動加載
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
imageView.getViewTreeObserver().addOnPreDrawListener(preDrawListener);

OnPreDrawListener preDrawListener = new OnPreDrawListener(){
    @
Override
   
public boolean onPreDraw() {
        
animationDrawable.start();
        
return true; //必須要有這個true返回
   
}
};

以上三種方法經過測試沒有問題,另外網上有一些說使用重寫Activity的onWindowFocusChanged()方法來實現,但是還是有不足,得改變焦點才能觸發,雖然理論可以自動實現改變焦點,感覺還是不甚可取。
(http://www.toplee.com/blog/1345.html)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章