热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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  ImageModelRequest using(final StreamModelLoader modelLoader) { 
  return new ImageModelRequest(modelLoader);
}

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

public class ProgressModelLoader implements StreamModelLoader { 

 private Handler handler; 

 public ProgressModelLoader(Handler handler) {  
  this.handler = handler; 
 } 

 @Override 
 public DataFetcher 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

总结

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


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 打开文件管理器_【教程】模组管理器3.1食用指南
    文编:byakko最近有部分小伙伴反应还不会使用unity模组管理器,现在我就给大家讲一下unity模组管理器——从下载到使用。完整视频版以下是无WiF ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
author-avatar
贱男人少勾引天d_483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有