2014-09-26 39 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