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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
上一篇: 什么是生态农业(生态农业技术怎么样)