2016-03-17 43 views
0

我使用container recyclerview在Imageview中加載gif圖像。 目前recyclerview只有1個gif和其他位圖。 我加載GIF作爲Glide - 無法停止gif onClick-獲取TransitionDrawable而不是Animate/GifDrawable

Glide.with(context). 
load("https://media.giphy.com/media/TcKmUDTdICRwY/giphy.gif"). 
asGif(). 
override(params.width, params.height). 
diskCacheStrategy(DiskCacheStrategy.RESULT). 
placeholder(R.drawable.placeholder). 
error(R.drawable.error). 
listener(new RequestListener<Uri, GifDrawable>() { 
     @Override 
     public boolean onException(Exception e, Uri model, Target<GifDrawable> target, boolean isFirstResource) { 
       return false; 
     } 

     @Override 
     public boolean onResourceReady(GifDrawable resource, Uri model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       resource.stop(); //Stoping gif animation on complete download 
       return false; 
       } 
     }). 
     into(feed.imgFeed); 

我要按需加載的gif即當GIF圖像全部下載完畢,我不想當用戶點擊它來啓動它自己相當。 在click事件中,如果它是Animated/GifDrawable來檢查可繪製實例以啓動動畫。 但我收到不允許動畫的TransitionDrawable。

+0

你找到解決辦法?如果沒有,那麼讓我知道我可以幫助你。 – AndroidLad

+0

謝謝,得到解決方案 –

+0

我也做了一些竅門,我也需要整潔乾淨的解決方案。你能幫我解決這個問題嗎? – AndroidLad

回答

1

這是一種替代方法:

  • 使用.diskCacheStrategy(SOURCE)有快速GIF顯示。
  • 一旦你有SOURCE緩存,你可以顯示圖像.asBitmap()強制顯示第一幀。
  • SOURCE也將確保加載第一幀和動畫時文件不會被下載兩次。
  • onClick加載相同的圖像與不同的參數,即.asGif()「開始動畫」,這將節省大量的內存和處理,如果你有多個GIFs

這裏我們代碼:

final Uri uri = Uri.parse("https://media.giphy.com/media/TcKmUDTdICRwY/giphy.gif"); 
final BitmapRequestBuilder<Uri, GlideDrawable> thumbRequest = Glide 
     .with(context) 
     .load(uri) 
     .asBitmap() // force first frame for Gif 
     .transcode(new BitmapToGlideDrawableTranscoder(context), GlideDrawable.class) 
     .override(params.width, params.height) 
     .diskCacheStrategy(DiskCacheStrategy.ALL) 
     .placeholder(R.drawable.image_placeholder) 
     .error(R.drawable.image_error) 
     .fitCenter(); 

thumbRequest.into(feed.imgFeed); 

feed.imgFeed.setOnClickListener(new OnClickListener() { 
    @Override public void onClick(View v) { 
     Glide 
       .with(context) 
       .load(uri) // load as usual (Gif as animated, other formats as Bitmap) 
       .override(params.width, params.height) 
       .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
       .placeholder(R.drawable.image_placeholder) 
       .error(R.drawable.image_error) 
       .thumbnail(thumbRequest) 
       .dontAnimate() 
       .into(feed.imgFeed); 
    } 
}); 
+0

將嘗試您的解決方案,謝謝。 –

0

確定

我不得不改變步驟裝入的GIF作爲甚至加載第一幀被服用太多的時間,並且正在採取1點MB的數據(arbitary值),這樣用戶會浪費5 MB剛剛加載5周的GIF的幀。 因此改變了流動,同時2圖像版本從服務器

  1. GIF,實際圖像
  2. 的Gif的第一幀中,100kb的最大

加載GIF圖像點擊作品並保存數據,以及。

+0

你如何獲得GIF的第一幀?我沒有看到任何的Glide API可以做到這一點。 –

+0

gif的第一幀實際上是一個位圖圖像。我使用了兩個圖像版本,一個是這個靜態位圖,另一個是實際的GIF。 –

+0

我的意思是,有沒有辦法攔截它並強制Glide只解碼第一幀?我只看到'asBitmap'和'DiskStrategy.RESULT'可以做到這一點。但是如果我把我的圖片(PNG,JPEG)以不同的大小顯示,它會再次下載,因爲'DiskStrategy.RESULT'選項告訴Glide只存儲調整大小的文件緩存。你是如何根據需求分配這兩個流量的? –