2014-11-03 182 views
0

我正在整合giphy到我的android應用程序。如何在android中從url中播放動畫GIF圖像?

我該如何在Android上玩animated gif圖片?我應該使用ImageView, WebView, VideoView等嗎?例如,如果我想從this網址播放動畫。

+0

http://stackoverflow.com/questions/3660209/display-animated-gif – 2014-11-03 10:22:07

+0

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html – Naufal 2014-11-03 10:22:44

+0

如果你做了研發,那麼你可以找到它。 http://gayashan-a.blogspot.in/2012/02/android-how-to-display-gif-image-in.html,http://android-er.blogspot.in/2014/03/load- animated-gif-from-internet.html,http://androidsurya.blogspot.in/2014/03/how-to-load-animated-.gif-from-internet-programmatically-in-android-example-how-to -show-gif-images-in-android.html – Piyush 2014-11-03 10:23:11

回答

2

只需創建一個html字符串並將其加載到android webview中即可。測試的解決方案。

http://developer.android.com/reference/android/webkit/WebView.html#loadData(java.lang.String,java.lang.String中,java.lang.String中)

String x = "<!DOCTYPE html><html><body><img src=\"http://goo.gl/uPJ9P2\" alt=\"Smileyface\" width=\"100%\" height=\"100%\"></body></html>"; 

webView.loadData(x, "text/html", "utf-8"); 
+0

是這樣,我應該把URL字符串內X =「 http://giphy.com/gifs/funny-cat-DFiwMapItOTh6」 – 2014-11-03 10:39:35

+0

u能plzz寫什麼要我把裏面的字符串x..the代碼ü上面給不具備的起始體標記,但確實有一個結束body標籤?是IMG標記?thanku烏拉圭回合時間... – 2014-11-03 10:42:44

+0

@ user3753273檢查現在 – Javanator 2014-11-03 10:53:37

1

嘗試這種方式

Movie movie; 
    GifView(Context context) { 
     super(context); 
     movie = Movie.decodeStream(
       context.getResources().openRawResource(
         R.drawable.some_gif)); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     if (movie != null) { 
      movie.setTime(
       (int) SystemClock.uptimeMillis() % movie.duration()); 
      movie.draw(canvas, 0, 0); 
      invalidate(); 
     } 
    } 
+0

我想從網址播放..我應該用url替換R.drawable.some_gif嗎? – 2014-11-03 10:27:07

0

解決方案的總體草圖是使用聘請定製查看其中提請問定期將其自身繪製到畫布的電影。

第一步是構建Movie實例。有一個名爲decodeStream的工廠,可以通過InputStream創建電影,但僅使用來自UrlConnection的流是不夠的。如果您嘗試此操作,您將在電影加載器嘗試調用流上的重置時收到IOException。不幸的是,使用一個單獨的BufferedInputStream和一個手動設置的標記來告訴它保存足夠的數據,以便重置不會失敗。幸運的是,URLConnection可以告訴我們需要多少數據。我說這種攻擊是不幸的,因爲它有效地要求將整個圖像緩衝在內存中(這對桌面應用程序來說不成問題,但對於內存受限的移動設備而言這是一個嚴重問題)。

這裏是電影設置代碼的剪斷:

URL url = new URL(gifSource); 
URLConnection conn = url.openConnection(); 
InputStream is = conn.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 
bis.mark(conn.getContentLength()); 
Movie movie = Movie.decodeStream(bis); 
bis.close(); 

接下來,你需要創建一個顯示該電影的視圖。具有自定義onDraw的視圖的子類將執行該技巧(假設它可以訪問用前面的代碼創建的電影)。

@Override protected void onDraw(Canvas canvas) { 
    if(movie != null) { 
     long now = android.os.SystemClock.uptimeMillis(); 
     int dur = Math.max(movie.duration(), 1); // is it really animated? 
     int pos = (int)(now % dur); 
     movie.setTime(pos); 
     movie.draw(canvas, x, y); 
    } 
} 

視圖不會觸發本身沒有幫助重繪,盲目地調用無效()在的onDraw結束僅僅是一個能源浪費。在另一個線程(可能是您用來下載圖像數據的線程)中,您可以將消息發佈到主線程,要求視圖以穩定(但不是瘋狂)的速度失效。

Handler handler = new Handler(); 
new Thread() { 
    @Override public void run() { 
     // ... setup the movie (using the code from above) 
     // ... create and display the custom view, passing the movie 

     while(!Thread.currentThread().isInterrupted()) { 
      handler.post(new Runnable() { 
       public void run(){ 
        view.invalidate(); 
       } 
      }); 
      try { 
       Thread.sleep(50); // yields 20 fps 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    } 
}.start(); 

希望這將有助於您瞭解

1

我建議使用第三方庫像Glide可以支持GIF格式。

我做了一個快速的示例應用程序來顯示從Giphy的API here GIF。

希望幫助