Android图片加载库:最全面解析Glide用法

前言

  • 上文已经对当今Android主流的图片加载库进行了全面介绍 & 对比

    如果你还没阅读,我建议你先移步这里进行查看

  • 今天我们来学习一下其中一个Android主流的图片加载库的使用 - Glide


目录

目录


1. 简介

  • 介绍:Glide,是Android中一个图片加载开源库

    Google的开源项目

  • 主要作用:实现图片加载

2. 功能特点

2.1 功能列表

功能列表

  • 从上面可以看出,Glide不仅实现了图片异步加载的功能,还解决了Android中加载图片时需要解决的一些常见问题
  • 接下来,我会对Glide的每个功能点进行详细的介绍

2.2 功能介绍

2.2.1 关于图片加载

  • 图片的异步加载(基础功能)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
String Url = "http://218.192.170.132/1.jpg";
//Glide使用了流式接口的调用方式
//Glide类是核心实现类。
Glide.with(context).load(Url).into(targetImageView);
//实现图片加载功能至少需要三个参数:
//with(Context context)
//Context对于很多Android API的调用都是必须的,这里就不多说了
//load(String imageUrl):被加载图像的Url地址。
//大多情况下,一个字符串代表一个网络图片的URL。
//into(ImageView targetImageView):图片最终要展示的地方。
  • 设置加载尺寸
  • 1
    Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
  • 设置加载中以及加载失败图片
    api里面对placeholder()、error()函数中有多态实现,用的时候可以具体的熟悉一下

1
2
3
4
Glide
.with(this)
.load(imageUrl)
.placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
  • 设置加载动画
  • 1
    Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);

api也提供了几个常用的动画:比如crossFade()
R.anim.item_alpha_in

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
  • 设置要加载的内容
    项目中有很多需要先下载图片然后再做一些合成的功能,比如项目中出现的图文混排,该如何实现目标下
1
2
3
4
5
6
Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
imageView.setImageDrawable(resource);
}
});

2.2.2 多样式的媒体加载

1
2
3
4
5
6
7
8
9
Glide
.with(context)
.load(imageUrl);
.thumbnail(0.1f);//设置缩略图支持:先加载缩略图 然后在加载全图
//传了一个 0.1f 作为参数,Glide 将会显示原始图像的10%的大小。
//如果原始图像有 1000x1000 像素,那么缩略图将会有 100x100 像素。
.asBitmap()//显示gif静态图片
.asGif();//显示gif动态图片
.into(imageView);

2.2.3 关于缓存

  • 设置磁盘缓存策略
1
2
3
4
5
6
7
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
//缓存参数
//ALL:缓存源资源和转换后的资源(即所有版本,默认行为)
//NONE:不作任何磁盘缓存。然而,默认的它将仍然使用内存缓存!
//SOURCE:仅缓存源资源(原来的全分辨率的图像)。
//在我们上面略缩图的例子中,将会只有一个1000x1000 像素的图片
//RESULT:缓存转换后的资源(最终的图像,即降低分辨率后的(或者是转换后的)
  • 设置跳过内存缓存
1
2
3
4
5
6
7
8
Glide
.with(this)
.load(imageUrl)
.skipMemoryCache(true)
.into(imageView);
//设置跳过内存缓存
//这意味着 Glide 将不会把这张图片放到内存缓存中去
//这里需要明白的是,这只是会影响内存缓存!Glide 将会仍然利用磁盘缓存来避免重复的网络请求。
  • 清理缓存
1
2
Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行

2.2.4 其他设置

  • 生命周期集成
    通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来
1
2
3
4
.with(Context context)// 绑定Context
.with(Activity activity);// 绑定Activity
.with(FragmentActivity activity);// 绑定FragmentActivity
.with(Fragment fragment);// 绑定Fragment

注意:

  1. 传入的context类型影响到Glide加载图片的优化程度
  2. Glide可以监视Activity的生命周期,在Activity销毁的时候自动取消等待中的请求。但是如果你使用Application context,你就失去了这种优化效果。
  • 设置动态转换

    1
    Glide.with(this).load(imageUrl).centerCrop().into(imageView);
  • 设置下载优先级

    1
    Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);

3. Demo实例

没有Demo的代码讲解不是好文章,让我们来一步步学会使用Glide。

步骤1:在gradle添加依赖

1
compile 'com.github.bumptech.glide:glide:3.7.0'

步骤2:添加网络权限

1
<uses-permission android:name="android.permission.INTERNET"/>

步骤1和步骤2是Glide使用的前提,千万别忘了!!!!

步骤3:在MainActivity中

1
2
3
4
5
6
7
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
String Url = "http://218.192.170.132/1.jpg";
Glide
.with(this)
.load(Url)
.into(targetImageView);

还有具体其他功能需要配置的自己按照我上面写的进行配置就好了~

这里再贴上Glide的Github地址:请点击这里

4. 特点

4.1 优点

  • 多样化媒体加载
    Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video

  • 生命周期集成
    通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来

  • 高效的缓存策略
    A. 支持Memory和Disk图片缓存
    B. Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的图片尺寸

    比如你 ImageView 大小是200200,原图是 400400 ,而使用 Glide 就会缓存 200200 规格的图,而 Picasso 只会缓存 400400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了每次裁剪重新渲染的过程,非常灵活 & 加载速度快

    C. 内存开销小
    默认的 Bitmap 格式是 RGB_565 格式,而 Picasso 默认的是 ARGB_8888 格式,这个内存开销要小一半。

    Android关于图片内存计算,共有四种,分别是:

    1. ALPHA_8:每个像素占用1byte内存
    2. ARGB_4444:每个像素占用2byte内存
    3. ARGB_8888:每个像素占用4byte内存(默认,色彩最细腻=显示质量最高=占用的内存也最大)
    4. RGB_565:每个像素占用2byte内存(8bit = 1byte)
      举例说明:一个32位的PNG=ARGB_8888=1204x1024,那么占用空间是:1024x1024x(32/8) = 4,194,304kb=4M左右
      在解析图片的时候,为了避免oom和节省内存,最好使用ARGB_4444模式(节省一半的内存空间)

4.2 缺点

  • 使用方法复杂
    由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂
  • 包较大

5. 相比其他图片加载库(Picasso & Fresco)

  • 对比Picasso
    Glide 是在Picasso 基础之上进行的二次开发做了不少改进,不过这也导致包比 Picasso 大不少,不过也就不到 500k(Picasso 是100多k),用法较为复杂,不过毕竟级别还是蛮小的,影响不是很大
  • 对比Fresco
    使用较Fresco简单,但性能(加载速度 & 缓存)却比不上Fresco

6. 应用场景

根据Glide的特点和与其他图片加载库的对比,可以得出其使用场景:

  • 需要更多的内容表现形式(如Gif);
  • 更高的性能要求(缓存 & 加载速度);

7. 总结

  • Glide使用起来是不是非常简单?相信你看完这篇文章后你能全面掌握Glide的用法
  • 但是Glide的源码却不简单,接下来我会对Glide的源码进行详细分析,如果感兴趣的话可以继续关注Carson_Ho的安卓开发笔记!!!!

欢迎关注Carson_Ho的简书!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

文章目录
  1. 1. 前言
  2. 2. 目录
  3. 3. 1. 简介
  4. 4. 2. 功能特点
    1. 4.1. 2.1 功能列表
    2. 4.2. 2.2 功能介绍
      1. 4.2.0.1. 2.2.1 关于图片加载
      2. 4.2.0.2. 2.2.2 多样式的媒体加载
      3. 4.2.0.3. 2.2.3 关于缓存
      4. 4.2.0.4. 2.2.4 其他设置
  • 5. 3. Demo实例
  • 6. 4. 特点
    1. 6.0.0.1. 4.1 优点
    2. 6.0.0.2. 4.2 缺点
  • 7. 5. 相比其他图片加载库(Picasso & Fresco)
  • 8. 6. 应用场景
  • 9. 7. 总结
    1. 9.0.1. 欢迎关注Carson_Ho的简书!
  • ,