欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Glide实现加载图片显示进度条效果

程序员文章站 2023-12-01 11:10:40
先来看看效果图: glide作为最近几年刚开始流行起来的图片加载库,功能非常强大,我相信好多人都开始在项目中使用了,网上关于glide的使用教程也非常多,最近在项...

先来看看效果图:

Glide实现加载图片显示进度条效果

glide作为最近几年刚开始流行起来的图片加载库,功能非常强大,我相信好多人都开始在项目中使用了,网上关于glide的使用教程也非常多,最近在项目中要实现图片的进度条加载,在网上也没看到有现成的,就想着自己研究一下。

使用

glide.with(mainactivity.this).using(new progressmodelloader(
new progresshandler(mainactivity.this, progressimageview))). 
load("http://image2.sina.com.cn/dy/o/2004-11-10/1100077821_2laygs.jpg")  
.diskcachestrategy(diskcachestrategy.none).into(progressimageview.getimageview());

思路

glide的图片下载底层用的是okhttp,它已经实现好了,所有要实现进度条加载,就必须要知道图片下载的进度,就要自己来写图片的下来实现,但是glide支持不支持呢?网上查了一下发现它有个方法

public <t> imagemodelrequest<t> using(final streammodelloader<t> modelloader) { 
  return new imagemodelrequest<t>(modelloader);
}

这个方法可以指定图片请求loader,我们创建一个progressmodelloader类,实现streammodelloader接口

public class progressmodelloader implements streammodelloader<string> { 

 private handler handler; 

 public progressmodelloader(handler handler) {  
  this.handler = handler; 
 } 

 @override 
 public datafetcher<inputstream> getresourcefetcher(string model, int width, int height) {  
  return new progressdatafetcher(model, handler); 
 }
}

重写getresourcefetcher方法,这个方法返回一个datafetcher类,这个类是个数据提取类,是个接口,重写它的loaddata方法来下载图片,我们来看下我创建的progressdatafetcher对loaddata方法的重写

@override
public inputstream loaddata(priority priority) throws exception { 
 request request = new request.builder().url(url).build(); 
 okhttpclient client = new okhttpclient(); 
 client.interceptors().add(new progressinterceptor(getprogresslistener())); 

 try {  
  progresscall = client.newcall(request);  
  response response = progresscall.execute();  
  if (iscancelled) {   
  return null;  
  }  

  if (!response.issuccessful()) throw new ioexception("unexpected code " + response);  
  stream = response.body().bytestream(); 
  } catch (ioexception e) {  
  e.printstacktrace();  
  return null; 
  } 
  return stream;
 }

使用okhttp下载图片,添加一个拦截器

public class progressinterceptor implements interceptor { 

 private progresslistener progresslistener; 

 public progressinterceptor(progresslistener progresslistener) { 
  this.progresslistener = progresslistener; 
 } 

 @override 
 public response intercept(chain chain) throws ioexception { 
  response originalresponse = chain.proceed(chain.request()); 
 return originalresponse.newbuilder().body(new progressresponsebody(originalresponse.body(), progresslistener)).build(); 
 }
}

重写intercept方法,创建一个progressresponsebody得到图片下载的进度,来看一下读流的方法

private source source(source source) { 
 return new forwardingsource(source) {  
  long totalbytesread = 0;  
 @override  
 public long read(buffer sink, long bytecount) throws ioexception {   
  long bytesread = super.read(sink, bytecount);  
  totalbytesread += bytesread != -1 ? bytesread : 0;  
  if(progresslistener != null) 
  progresslistener.progress(totalbytesread, responsebody.contentlength(), bytesread == -1);   
  return bytesread;  
 } 
 };
}

把读到的bytesread和responsebody.contentlength()传给回调方法progresslistener.progress来计算进度。

大体实现逻辑到此就结束了,想看完整代码的移步至https://github.com/chenpengfei88/glideloadimageprogress或者可以通过本地下载:http://xiazai.jb51.net/201705/yuanma/glideloadimageprogress(jb51.net).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。