Earth Guardian

You are not LATE!You are not EARLY!

0%

Glide

介绍

Glide[glaɪd] 是一个快速高效的 Android 图片加载库,注重于平滑的滚动。支持拉取,解码和展示视频快照,图片,GIF 动画。默认情况下,Glide 使用的是一个定制化的基于 HttpUrlConnection 的栈,但同时也提供了与 Google VolleySquare OkHttp 快速集成的工具库

github官网官方文档

特性

  • 图片大小
    Glide 根据 Imageview 的宽高,下载对应大小的图片并本地保存,而不是直接下载原始大小的图片。同一张图片,当 Imageview 宽高改变时,Glide 会重新下载
  • 存储位置
    下载图片存储位置: /data/data/包名/cache/image_manager_disk_cache

依赖

1
2
3
4
dependencies {
compile 'com.github.bumptech.glide:glide:4.1.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
}

基本概念

标准用法

Glide 使用简明的流式语法 API,最常用的方法:

1
2
3
Glide.with(fragment)    // context 自动管理生命周期
.load(url) // 加载图片的 url
.into(imageView); // 指定对应的 imageview

with(context) 中的 context 尽量直接使用 ActivityFragment ,而不是 ApplicationContext,因为 Glide 会维护生命周期,在 Acitivity/Fragment 销毁时自动取消加载并释放资源

裁剪和填充

ImageView 大小和图片原始大小:

0017-glide-origin.png

  • centerCrop
    按照图片中心位置放大,填充满整个 ImageView,如果多出的部分裁剪掉

0017-glide-centerCrop.png

  • fitCenter
    按比例将图片完整显示,尺寸不足部分留白

0017-glide-fitCenter.png

ImageViewscaletype 对应关系如下,查看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// GenericRequestBuilder::into
switch (view.getScaleType()) {
case CENTER_CROP:
applyCenterCrop();
break;
case FIT_CENTER:
case FIT_START:
case FIT_END:
applyFitCenter();
break;
//$CASES-OMITTED$
default:
// Do nothing.
}

其他默认为使用 ImageView 设置的属性

  • ImageView 固定宽度,高度自适应图像完全显示,在 Glide 中的解决方案
    同时指定 adjustViewBoundsfitXY
1
2
3
4
5
6
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"/>

其实这就是 ImageView 标准用法,网上查看教程提到在 Glide 中不生效,实测 Glide 3.8 版本是可以生效的

占位符 placeholder

placeholder :当图片还没有加载成功时,避免布局抖动或者为空,先显示该占位符的图片,用法:

1
2
3
4
Glide.with(fragment)
.load(url)
.placeholder(R.drawable.logo)
.into(imageView);

常见使用流程

  • 添加依赖
  • 初始化 ImageView 并准备资源图
  • Fragment/Activity主线程中使用
1
2
3
4
Glide.with(fragment)
.load(url)
.placeholder(R.drawable.logo)
.into(imageView);

就这么简单!其他复杂使用方法,可以参考官方教程

常见问题

RecyclerView 设置宽度填充满屏幕,高度自适应,遇到的问题

  • 问题描述
  1. 第一次加载时,Glide 加载的图片没有达到要求,图片变小了
  2. 上下滑动,RecyclerView 在复用 imageview 时,因为尺寸问题,会导致正常显示的图片,因为复用导致 imageview 大小发生变化,从而 Glide 重新下载了一张错误尺寸的图片
  • 解决方案:ImageView xml 配置文件中增加:
1
2
android:adjustViewBounds="true"
android:scaleType="fitXY"
  • 原因:
    fitXY :这种图片的显示方式的效果是:根据 ImageView 设置的大小拉伸图片以填充满空间,(单独设置此属性时)图片会变形
    adjustViewBounds :是限制图片在显示时保持原图比例,和 fitXY 显示方式合用能到达自适应的效果

参考:Glide坑遇记:宽度铺满高度自适应

参考文档

  1. github官网
  2. 官方文档
  3. Glide 使用必须知道的基础属性
  4. Glide: 一个图片列表的问题
  5. Glide使用及注意的地方
  6. Glide的一些用法
  7. Android图片缓存之初识Glide