如何方便而又快速地显示网络图片,一直是安卓网络编程的热门课题,前些年图片缓存框架Picasso、Fresco等等大行其道,以至于谷歌按捺不住也开发了自己的Glide开源库。由于Android本身就是谷歌开发的,Glide与Android系出同门,因此Glide成为事实上的官方推荐图片缓存框架。不过Glide并未集成到Android的SDK当中,开发者需要另外给App工程导入Glide库,也就是修改模块的build.gradle,在dependencies节点内部添加如下一行依赖库配置:

    implementation 'com.github.bumptech.glide:glide:4.11.0'

导包完成之后,即可在代码中正常使用Glide。当然Glide的用法确实简单,默认情况只要以下这行代码就够了:

        Glide.with(活动实例).load(网址字符串).into(图像视图);

可见Glide的图片加载代码至少需要三个参数,说明如下:
1、当前页面的活动实例,参数类型为Activity。如果是在页面代码内部调用,则填写this表示当前活动即可。
2、网络图片的链接地址,以http或者https打头,参数类型为字符串。
3、准备显示网络图片的图像视图实例,参数类型为ImageView。
假设在Activity内部调用Glide,且图片链接放在mImageUrl,演示的图像视图名叫iv_network,那么实际的Glide加载代码是下面这样的:

        Glide.with(this).load(mImageUrl).into(iv_network);

如果不指定图像视图的拉伸类型,Glide默认采用FIT_CENTER方式显示图片,相当于在load方法和into方法中间增加调用fitCenter方法,就像如下代码这般:

        // 显示方式为容纳居中fitCenterGlide.with(this).load(mImageUrl).fitCenter().into(iv_network);

除了fitCenter方法,Glide还提供了centerCrop方法对应CENTER_CROP,提供了centerInside方法对应CENTER_INSIDE,其中增加centerCrop方法的加载代码如下所示:

        // 显示方式为居中剪裁centerCropGlide.with(this).load(mImageUrl).centerCrop().into(iv_network);

增加centerInside方法的加载代码如下所示:

        // 显示方式为居中入内centerInsideGlide.with(this).load(mImageUrl).centerInside().into(iv_network);

另外,Glide还支持圆形剪裁,即只显示图片中央的圆形区域,此时方法调用改成了circleCrop,具体代码示例如下:

        // 显示方式为圆形剪裁circleCropGlide.with(this).load(mImageUrl).circleCrop().into(iv_network);

以上四种显示方式的界面效果分别如下列四图所示。


虽然Glide支持上述四种显示类型,但它无法设定FIT_XY对应的平铺方式,若想让图片平铺至充满整个图像视图,还得调用图像视图的setScaleType方法,将拉伸类型设置为ImageView.ScaleType.FIT_XY。
一旦把图像视图的拉伸类型改为FIT_XY,则之前的四种显示方式也将呈现不一样的景象,拉伸类型变更后的界面分别如下列四图所示。


图片缓存框架之所以高效,是因为它不但封装了访问网络的步骤,而且引入了三级缓存机制。具体说来,是先到内存中查找图片,有找到就直接显示内存图片,没找到的话再去磁盘查找图片;在磁盘能找到就直接显示磁盘图片,没找到的话再去请求网络;如此便形成“内存→磁盘→网络”的三级缓存。
对于Glide而言,默认已经开启了三级缓存机制,当然也可以根据实际情况另行调整。除此之外,Glide还提供了一些个性化的功能,方便开发者定制不同场景的需求。具体到编码上,则需想办法将个性化选项告知Glide,比如下面这句图片加载代码:

        Glide.with(this).load(mImageUrl).into(iv_network);

可以拆分为以下两行代码:

        // 构建一个加载网络图片的建造器RequestBuilder<Drawable> builder = Glide.with(this).load(mImageUrl);builder.into(iv_network); // 在图像视图上展示网络图片

原来load方法返回的是请求建造器,调用建造器对象的into方法,方能在图像视图上展示网络图片。除了into方法,建造器RequestBuilder还提供了apply方法,该方法表示启用指定的请求选项。于是添加了请求选项的完整代码示例如下:

        // 构建一个加载网络图片的建造器RequestBuilder<Drawable> builder = Glide.with(this).load(mImageUrl);RequestOptions options = new RequestOptions(); // 创建glide的请求选项// 在图像视图上展示网络图片。apply方法表示启用指定的请求选项builder.apply(options).into(iv_network);

可见请求选项为RequestOptions类型,详细的选项参数就交给它的下列方法了:
placeholder:设置加载开始的占位图。在得到网络图片之前,会先在图像视图展现占位图。
error:设置发生错误的提示图。网络图片获取失败之时,会在图像视图展现提示图。
override:设置图片的尺寸。注意该方法有多个重载方法,倘若调用只有一个参数的方法并设置Target.SIZE_ORIGINAL,表示展示原始图片;倘若调用拥有两个参数的方法,表示先将图片缩放到指定的宽度和高度,再展示缩放后的图片。
diskCacheStrategy:设置指定的缓存策略。
skipMemoryCache:设置是否跳过内存缓存(但不影响硬盘缓存)。为true表示跳过,为false表示不跳过。
disallowHardwareConfig:关闭硬件加速,防止过大尺寸的图片加载报错。
fitCenter:保持图片的宽高比例并居中显示,图片需要顶到某个方向的边界但不能越过边界,对应拉伸类型FIT_CENTER。
centerCrop:保持图片的宽高比例,充满整个图像视图,剪裁之后居中显示,对应拉伸类型CENTER_CROP。
centerInside:保持图片的宽高比例,在图像视图内部居中显示,图片只能拉小不能拉大,对应拉伸类型CENTER_INSIDE。
circleCrop:展示圆形剪裁后的图片。
另外,Glide允许播放加载过程的渐变动画,让图片从迷雾中逐渐变得清晰,有助于提高用户体验。这个渐变动画通过建造器的transition方法设置,调用代码例子如下所示:

        builder.transition(DrawableTransitionOptions.withCrossFade(3000)); // 设置时长3秒的渐变动画

加载网络图片的渐变过程效果如下面两图所示。

点此查看Android开发笔记的完整目录

Android开发笔记(一百七十一)使用Glide加载网络图片相关推荐

  1. Android开发笔记(七十一)区分开发模式和上线模式

    为什么要区分两种模式 许多开发者(包括博主在内)都是闷骚的程序员,为了开发调试方便,常常在代码里加上日志,还经常在页面上各种弹窗提示.这固然有利于发现bug.提高软件质量,但过多的调试信息往往容易泄露 ...

  2. Android开发笔记(六十一)文件下载管理DownloadManager

    下载管理DownloadManager 文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些.因为下载功能比较常用,而且业务功能相对统一,所以从Androi ...

  3. Android开发笔记(八十一)屏幕规格适配

    Configuration 适配各种屏幕规格,首先要取到系统对于屏幕的配置信息,这些配置可从工具类Configuration获得.Configuration对象在Activity中通过调用getRes ...

  4. Android开发笔记(七十七)图片缓存算法

    ImageCache 由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存.图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了.只要理解图片缓存的算法, ...

  5. Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...

  6. Android开发笔记(七十三)代码混淆与反破解

    代码混淆 ProGuard是ADT自带的apk混淆器,它的用途有: 1.压缩apk包的大小,能删除无用的代码,并简化部分类名和方法名. 2.加大破解源码的难度,因为部分类名和方法名被重命名,使得程序逻 ...

  7. Android开发笔记(五十一)通过Messenger实现进程间通信

    进程间通信IPC IPC是"Inter-Process Communication"的缩写,即进程间通信.Android为APP提供了多进程工作模式,这是因为多线程存在若干局限: ...

  8. Unity+C#开发笔记(一)| 如何动态加载预制件 | ╭(●`∀´●)╯╰(●’◡’●)╮

    首先是跟随这篇文章学习的~:https://blog.csdn.net/linshuhe1/article/details/51355198/~写的非常细致,感谢河乐不为大佬~ **********下 ...

  9. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

最新文章

  1. 深度学习中的优化算法之MBGD
  2. 连接统计学、机器学习与自动推理的新兴交叉领域——因果科学读书会再起航...
  3. 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 )
  4. 学习视觉和语言的多粒度对齐?字节提出新多模态预训练方法 X-VLM:代码已开源!...
  5. 移动Exchange2007 CCR邮箱存储路径
  6. feignclient注解使用_从 Feign 使用注意点到 RESTFUL 接口设计规范
  7. Qt中绑定信号槽之后,信号槽无效
  8. eclipse get set 自动添加注释
  9. hive 窗口函数(开窗函数)
  10. 计算机软考高级科目试题及答案,软考高级哪个含金量高 2018计算机软考信息系统项目管理师单选试题及答案...
  11. 微信小程序 下拉刷新 性能优化 参考饿了么小程序首页列表加载
  12. web项目防御mysql注入_WEB安全 php+mysql5注入防御(二)
  13. 华为会强迫升级鸿蒙,华为手机升级鸿蒙系统好用吗
  14. IJCAI2022论文合集(持续更新中)
  15. java-php-net-python-税务申报系统ssh计算机毕业设计程序
  16. Unity - RenderDoc 抓帧导出 FBX(带UV)
  17. 正则匹配 正则表达式在线工具
  18. iOS 相册,图片裁剪工具(附demo)
  19. 清华大学出版社与SAP签署战略合作协议
  20. CSS 发明者 Håkon Wium Lie 访谈(三)

热门文章

  1. Scikit-Learn与回归树
  2. 使用VScode + PicGo 写markdown 以及github图片加载不出的问题
  3. 数值计算基础(上溢下溢、梯度优化、牛顿法、KKT方法)
  4. 第十一周学习进度报告
  5. leetcode 870.优势洗牌
  6. Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)
  7. ios沙箱模式开启_iOS我眼中的沙盒机制
  8. 量子计算机张庆瑞讲座报告,燕山大学彭秋明、张庆瑞教授来我校开展学术交流...
  9. WebLogic命令行远程部署
  10. JVM调优大全及实战总结