2014-09-26 80 views
46

嗨我想要一個圖像的進度條,它將在圖像加載時顯示,但是圖像加載完成後會顯示我想將其設置爲消失。早些時候,我爲此使用了畢加索圖書館。但我不知道如何將它與Glide庫一起使用。我有想法,有一些資源就緒功能,但我不知道如何使用它。誰能幫我?設置使用Glide庫完成圖像加載後進度條的可見性

畢加索圖書館

Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink) 
     .into(imageView, new Callback() { 
      @Override 
      public void onSuccess() { 
       progressBar.setVisibility(View.GONE); 
      } 

      @Override 
      public void onError() { 
      } 
     }) 
; 

現在,我怎麼能做到這一點與滑翔碼?

Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink) 
    .into(imageView); 

我能夠通過這個與滑翔加載圖像,但我怎麼可以在代碼編寫progressBar.setVisibility(View.GONE);的地方,如果圖像獲取加載?

+2

你爲什麼要改變你的圖書館嗎?畢加索很棒。 – tasomaniac 2014-09-26 07:53:11

+0

我也建議堅持畢加索,除非你有充分的理由改變圖書館 – Chris 2014-09-26 08:54:20

回答

138

問題是相當老了,我不知道什麼是與這些次下滑的局面,但現在它可以用監聽器(很容易做到不提議在選擇的答案中是正確的)。

progressBar.setVisibility(View.VISIBLE); 
Glide.with(getActivity()) 
    .load(args.getString(IMAGE_TO_SHOW)) 
    .listener(new RequestListener<String, GlideDrawable>() { 
     @Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
      return false; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
      progressBar.setVisibility(View.GONE); 
      return false; 
     } 
    }) 
    .into(imageFrame) 
; 

如果想自己處理動畫等事情,並且如果想要滑動以處理它們,則返回false。

+0

這比接受的答案更好 – Frank 2015-08-26 10:28:47

+11

考慮在'onException'中隱藏'progressBar',否則它會無限期地旋轉,給出虛假的希望。一旦調用'onException',除了設置傳遞給'.error()'的內容之外,Glide將不會做任何事情。 – TWiStErRob 2015-10-21 10:36:19

+1

如果您在圖像加載前離開片段/活動,則可能會導致NullPointerException。 – aProperFox 2016-03-03 20:25:48

17

我的回答是基於過時的API。請參閱here瞭解更新的答案。

+0

'。listener()'更好,因爲你會收到更多關於你的負載(模型,內存緩存......)的信息,所以更容易決定更多的定製邏輯。 'RequestListener'也更穩定,重寫哪個'Target'創建不會給你未來修復的好處。您也可以輕鬆創建一個'VisibilityListener ',您可以在不同的環境中重複使用。 – TWiStErRob 2015-10-21 10:39:47

3

上面的解決方案對我來說也很好,但是當我使用asBitmap()來下載圖像。這是行不通的。

我們需要使用BitmapImageViewTarget

Glide.with(this) .load(imageURL) 
.asBitmap() 
.placeholder(R.drawable.bg) 
.into(new BitmapImageViewTarget(imageView) { 
      @Override 
      public void onResourceReady(Bitmap drawable, GlideAnimation anim) { 
       super.onResourceReady(drawable, anim); 
       progressBar.setVisibility(View.GONE); 
      } 
     }); 
+0

查看我的評論:http://stackoverflow.com/questions/26054420/set-visibility-of-progress-bar-gone-on-completion-of-image-loading-using-glide-l#comment54315331_26066582。這個答案很好地證明了我在那裏所說的。 – TWiStErRob 2015-10-21 10:42:43

6

異常投入了條件再次顯示了ProgressBar

Glide.with(context) 
    .load(image_url) 
    .listener(new RequestListener<String, GlideDrawable>() { 
     @Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
      if(e instanceof UnknownHostException) 
       progressBar.setVisibility(View.VISIBLE); 
      return false; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
      progressBar.setVisibility(View.GONE); 
      return false; 
     } 
    }) 
    .into(imageView); 
-2

這是最好的答案,因爲它不使用任何黑客,如設置可見性,以獲得所需的輸出。

下載進度條的GIF並將其稱爲progressbargif並將其放入可繪製文件夾中。

 Glide.with(ctx) 
      .load(url) 
      .thumbnail(Glide.with(ctx).load(R.drawable.progressbargif)) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .error(R.drawable.image_unavailable) 
      .crossFade(200) 
      .into(iv); 

一旦URL圖像加載,縮略圖就會消失。加載緩存圖像時,縮略圖會立即消失。

+0

之前調用。爲什麼此答案downvoted ? – suku 2017-02-15 15:53:53

+3

我認爲這是因爲它沒有回答這個問題:OP已經有了一個他很滿意的微調器。這也違背了Android的最佳做法:使用GIF作爲微調器是90年代,並顯着增加APK的大小;並且將GIF放入'drawable'本身就不好,因爲它沒有被框架加載,它應該最好是'raw'或'assets'。在應用中發生事件時更改可見性沒有任何問題,Android是爲此設計的。 – TWiStErRob 2017-03-05 12:32:33

+1

當GIF解碼發生時,用戶也會看到一個空的空間,它是異步的而不是立即的。你也是'結果' - 緩存進度條,這意味着它需要一段時間才能加載。爲了提高效率,GIF應該是「SOURCE」緩存的;但由於這是一個本地文件,所以緩存需要爲'NONE',不能在磁盤上覆制它,消耗更多的用戶空間。 – TWiStErRob 2017-03-05 12:39:52

1
  1. xml取高度爲& width(match_parent)的進度條。
  2. 在調用下面的提及方法之前,設置進度條的可見性可見。

    public void setImageWIthProgressBar(Context context, final ImageView imageView, String imageUrl, final ProgressBar progressBar) { 
    
         Glide.with(context) 
           .load(imageUrl) 
           .listener(new RequestListener<String, GlideDrawable>() { 
            @Override 
            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
             progressBar.setVisibility(View.GONE); 
             return false; 
            } 
    
            @Override 
            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
             progressBar.setVisibility(View.GONE); 
             return false; 
            } 
           }) 
           .into(imageView); 
    
        }//setImageWIthProgressBar 
    
+0

你的答案與https://stackoverflow.com/a/31675796/3812404有何不同?另外,不需要點1。 – HariRam 2017-05-25 13:15:35

4

如果你想這樣做在科特林,你可以試試這樣:

Glide.with(context) 
      .load(url) 
      .listener(object : RequestListener<Drawable> { 
       override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean { 
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
       } 
       override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean { 
        Log.d(TAG, "OnResourceReady") 
        //do something when picture already loaded 
        return false 
       } 
      }) 
      .into(imgView) 
+0

Kotlin版本就像一個魅力 – mrroboaat 2017-12-13 14:35:12