本文已参与「新人创作礼」活动,一起开启掘金创作之路。
简介
Coil是基于Kotlin协程实现的Android图片加载库. 它具有如下特点:
- 快: Coil执行了大量的优化, 包括内存和硬盘缓存, 内存图片采样, 请求自动暂停/取消, 等等.
- 轻: Coil仅向APK中添加了大约2000方法(对于已经使用了OkHttp和Coroutine的应用而言), 这和Picasso相当, 且比Glide和Fresco显著减少.
- 好用: Coil的API充分利用了Kotlin的语言特性, 简单且少模版代码.
- 现代: Coil是Kotlin第一, 且使用了诸如Coroutine, OkHttp, Okio, 和AndroidX Lifecycle等现代库.
Coil是首字母缩写: Coroutine Image Loader, 意思是协程图片加载器, 由instacart爱心制造.
下载¶
Coil通过mavenCentral()访问.
implementation("io.coil-kt:coil:2.1.0")
快速入门¶
ImageViews¶
要向ImageView中加载图片, 可以使用load扩展函数:
// URL
imageView.load("https://www.example.com/image.jpg")
// File
imageView.load(File("/path/to/image.jpg"))
// And more...
Request可能通过可选的尾置lambda来配置:
imageView.load("https://www.example.com/image.jpg") {
crossfade(true)
placeholder(R.drawable.image)
transformations(CircleCropTransformation())
}
Jetpack Compose¶
导入Jetpack Compose扩展库:
implementation("io.coil-kt:coil-compose:2.1.0")
要想加载图片, 使用AsyncImage可组合函数:
AsyncImage(
model = "https://example.com/image.jpg",
contentDescription = null
)
Image Loaders¶
imageView.load和AsyncImage都使用了单例ImageLoader来执行图片请求. 单例ImageLoader可以通过使用Context扩展函数来访问:
val imageLoader = context.imageLoader
ImageLoader设计成可共享的, 且在应用中创建单例共享时是最高效的. 即便如此, 你依然可能创建自己的ImageLoader实例:
val imageLoader = ImageLoader(context)
如果你不想要单例ImageLoader, 要依赖io.coil-kt:coil-base而不是io.coil-kt:coil.
Requests¶
要想向自定义目标加载图片, 将ImageRequest入队enqueue:
val request = ImageRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.target { drawable ->
// Handle the result.
}
.build()
val disposable = imageLoader.enqueue(request)
要想命令式地加载图片, 将ImageRequest执行execute:
val request = ImageRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.build()
val drawable = imageLoader.execute(request).drawable
Requirements¶
- Min SDK 21+
- Java 8+
R8 / Proguard¶
Coil完全兼容R8, 并不需要添加任何规则.
如果你使用Proguard, 你需要为Coroutines, OkHttp和Okio添加规则.