图片加载之Glide:从入门到实战

Glide,说实话,是我在Android项目里用得最多的图片加载库。没有之一。它轻量、高效,而且Google官方也推荐它。今天我就带你把它彻底搞明白。

Glide的基本使用

先来个最简单的例子。加载一张网络图片到ImageView里,代码就这么几行:

Glide.with(this)
     .load("https://example.com/image.jpg")
     .into(imageView);

嗯,就这么简单。但这里有个细节——with()方法传什么?我建议传Fragment或Activity的实例,这样Glide能自动感知生命周期,避免内存泄漏。你想想看,如果传Application Context,图片加载就不会随页面销毁而取消了,白白浪费资源。

占位图与错误图

网络不好的时候,用户盯着空白区域干等,体验很差。所以占位图是必须的。

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.placeholder)  // 加载中的占位图
     .error(R.drawable.error)              // 加载失败显示
     .into(imageView);

我在项目中遇到过一个问题:占位图尺寸和实际图片尺寸差异很大,导致布局突然跳动。后来我统一用了和实际图片宽高比一致的占位图,才解决。这个坑,你也要注意。

缓存策略:Glide的看家本领

Glide的缓存分两级:内存缓存和磁盘缓存。默认情况下,它已经帮你做了最优配置。但有些场景需要手动调整。

策略 说明 适用场景
DiskCacheStrategy.AUTOMATIC 默认策略,根据图片类型自动选择 大多数情况
DiskCacheStrategy.ALL 缓存原始图片和处理后的图片 图片需要多次变换时
DiskCacheStrategy.NONE 不缓存到磁盘 一次性展示的图片
DiskCacheStrategy.DATA 只缓存原始图片 只需要原图时
Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .skipMemoryCache(true)  // 跳过内存缓存
     .into(imageView);

我个人习惯在列表页用AUTOMATIC,在详情页用ALL。为什么?列表页图片多,缓存太多反而容易OOM;详情页就一两张图,缓存全一点,用户来回切换时体验更好。

图片变换:让图片更合心意

原始图片往往不符合UI设计的要求。Glide提供了丰富的变换能力。

Glide.with(this)
     .load(url)
     .transform(new CenterCrop(), new RoundedCorners(16))
     .into(imageView);

常用的变换有:

  • CenterCrop:居中裁剪,填满ImageView
  • FitCenter:按比例缩放,完整显示
  • CircleCrop:圆形裁剪,头像常用
  • RoundedCorners:圆角处理

我曾经踩过一个坑:多个变换叠加时,顺序会影响结果。比如先圆角再裁剪,和先裁剪再圆角,效果完全不同。建议你写代码时多跑几次看看效果。

Gif加载:Glide的隐藏技能

很多人不知道,Glide原生支持Gif加载。不需要额外引入其他库。

Glide.with(this)
     .asGif()
     .load(gifUrl)
     .into(imageView);

如果你想只显示Gif的第一帧,可以这样:

Glide.with(this)
     .asBitmap()
     .load(gifUrl)
     .into(imageView);

这里有个性能问题:Gif图片通常比较大,在列表里用Gif会卡顿。我建议只在详情页或单独展示页使用Gif,列表页用静态帧就够了。

知识体系总览

下面这张图,是我梳理的Glide核心知识结构。你看一眼就能明白各个模块的关系。

Glide 核心 基本使用 with() → load() → into() 占位图 & 错误图 placeholder() / error() 缓存策略 内存缓存 / 磁盘缓存 图片变换 CenterCrop / CircleCrop Gif 加载 asGif() / asBitmap() 生命周期管理 自动跟随 Activity/Fragment 核心原则:性能优先,体验至上

核心要点:Glide的强大在于它的自动化和灵活性。你只需要配置一次,它就能帮你处理好缓存、变换、生命周期这些琐事。但记住,没有银弹——理解每个配置的含义,才能用好它。

我的小技巧:在Application里统一配置Glide,比如全局的缓存大小、图片格式等。这样每个页面都不用重复写配置代码。

注意:Glide默认使用RGB_565格式,比ARGB_8888省一半内存。但如果图片需要透明度,记得手动指定格式为ARGB_8888,否则透明区域会变成黑色。

好了,Glide的核心用法就这些。说白了,它就是帮你把「从网络拿图片→缓存→显示到屏幕」这一整套流程封装好了。你只要告诉它「要什么、怎么显示」就行。下次遇到图片加载的需求,优先考虑Glide,准没错。


公众号:蓝海资料掘金营,微信deep3321