热门标签 | 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

总结

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


推荐阅读
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本报告涵盖了个人博客账号和码云账号的注册过程,以及对网络工程专业学习的反思与展望。通过回顾初入大学时的专业选择,分析当前的专业知识和技能水平,并对未来的职业规划进行了详细讨论。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
author-avatar
临临临峰_547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有