使用 Coil 加载图片
使用 Coil 高效加载和缓存网络图片。应用变换(CircleCrop、RoundedCorners),并处理占位图和错误。
使用 Coil 加载图片 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 6 节课。
为什么需要图像库?
从互联网加载图片,实际比想象中复杂:
- 在后台线程下载
- 缓存到磁盘和内存
- 高效解码(避免 OOM 崩溃)
- 加载时显示占位图
- 处理错误(链接失效、无网络)
Coil 用一行代码即可处理所有这些工作。
什么是 Coil?
Coil(Coroutine Image Loader)是一个现代 Android 图像加载库,专为 Kotlin 和协程打造。
- 轻量 — 比 Glide 或 Picasso 更小
- Kotlin 优先,并支持协程
- 感知生命周期 — 自动取消加载
- 支持 GIF、SVG 和视频帧
添加 Coil
在 app/build.gradle 中添加依赖项:
// app/build.gradle
dependencies {
implementation 'io.coil-kt:coil:2.6.0'
}
// Also make sure internet permission is in AndroidManifest.xml:
// <uses-permission android:name="android.permission.INTERNET" />基础图像加载
用一行代码将图片加载到 ImageView 中:
import coil.load
// In your Activity or Adapter:
binding.ivAvatar.load("https://picsum.photos/200")
// With a placeholder and error image:
binding.ivAvatar.load("https://picsum.photos/200") {
placeholder(R.drawable.ic_placeholder)
error(R.drawable.ic_error)
crossfade(true) // smooth fade-in animation
}在 RecyclerView 中加载
当 ViewHolder 被回收时,Coil 会自动取消待处理的加载,从而防止错误的图片出现在错误的行中:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val post = getItem(position)
holder.tvTitle.text = post.title
holder.ivCover.load(post.imageUrl) {
placeholder(R.drawable.ic_image_placeholder)
error(R.drawable.ic_broken_image)
crossfade(300) // 300ms fade-in
size(200, 200) // resize to 200×200 pixels
}
}变换
对加载的图片应用变换:
CircleCropTransformation()— 将图片裁剪为圆形(非常适合头像)RoundedCornersTransformation(radius)— 添加圆角BlurTransformation(context, radius)— 添加模糊效果
变换示例
显示圆形用户头像:
import coil.load
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation
// Circular avatar
binding.ivAvatar.load(user.profileImageUrl) {
transformations(CircleCropTransformation())
placeholder(R.drawable.ic_default_avatar)
error(R.drawable.ic_default_avatar)
}
// Rounded corners on a card image
binding.ivCover.load(post.coverUrl) {
transformations(RoundedCornersTransformation(16f))
crossfade(true)
}缓存行为
Coil 会自动在两个层级缓存图片:
- 内存缓存 — 速度最快,应用被终止时会清除
- 磁盘缓存 — 在多次启动应用之间保留,默认大小为 250 MB
如果同一个网址被加载两次,第二次加载会直接从缓存中获取,不会发起网络请求。
从不同来源加载
Coil 不仅可以从网址加载图片,还可以从多种来源加载:
// From a URL (most common)
imageView.load("https://example.com/image.jpg")
// From a URI (e.g., gallery image)
imageView.load(uri)
// From a drawable resource
imageView.load(R.drawable.my_image)
// From a File
imageView.load(File("/sdcard/photo.jpg"))
// From a bitmap
imageView.load(bitmap)快速检查
如果要将用户个人资料照片显示为圆形,您会使用哪种 Coil 变换?
回顾:使用 Coil 加载图片
现在,您已经可以高效地显示网络图片:
- 只需添加一个 Gradle 依赖项即可引入 Coil
imageView.load(url) { }— 一行代码即可加载- 设置占位图片和错误备用图片
- 使用 CircleCrop、RoundedCorners 和 Blur 进行变换
- 自动在内存和磁盘层级进行缓存
- 支持网址、URI、文件、可绘制资源和位图
接下来:妥善处理错误,并为用户提供良好的反馈。
常见问题解答
「使用 Coil 加载图片」课时是免费的吗?
是的 — 「使用 Coil 加载图片」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 6 节课。
「使用 Coil 加载图片」这节课中我会学到什么?
使用 Coil 高效加载和缓存网络图片。应用变换(CircleCrop、RoundedCorners),并处理占位图和错误。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 6 节。
「使用 Coil 加载图片」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。