当前位置: 移动技术网 > IT编程>移动开发>Android > Glide实现加载图片显示进度条效果

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

无盐女美男多多,木下あずみ,夜半一点钟

先来看看效果图:


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或者可以通过本地下载:

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网