Coil 是一个 Android 图片加载库,通过Kotlin协程的方式加载图片。Coil 名字的由来:取 Coroutine Image Loader 首字母得来。
Coil的优势:
-
更快:
Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitmap,自动暂停和取消图片网络请求等。 -
更轻量级:
Coil 只有2000个方法(前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多。 -
更容易使用:
Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码。 -
更流行:
Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库。
Coil各个组件的作用:
io.coil-kt:coil-base : 基础组件,提供了基本的图片请求、图片解码、图片缓存、Bitmap 复用等功能
io.coil-kt:coil : 默认组件,依赖于io.coil-kt:coil-base,提供了 Coil 类的单例对象以及 ImageView 相关的扩展函数
io.coil-kt:coil-gif : 包含两个 decoder 用于支持解码 GIFs
io.coil-kt:coil-svg : 包含一个 decoder 用于支持解码 SVG
io.coil-kt:coil-video : 包含两个 fetchers 用于支持读取和解码 任何 Android 的支持的视频格式 的视频帧
使用场景:
常规加载图片:
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp")
imageView.load(R.mipmap.pic)
为什么ImageView可以直接调用coil库的load加载,因为库里在ImageViews类中给ImageView写了多个重载的load方法,所以imageView能直接调用load。
配置请求选项:
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
crossfade(true) //渐进渐出
placeholder(R.mipmap.ic_launcher) //加载中占位图
error(R.mipmap.ic_launcher) //加载失败占位图
}
Transformation(图片变换)
- BlurTransformation() : 高斯模糊变换
- CircleCropTransformation() : 圆形裁剪变换
- GrayscaleTransformation() : 灰度变换
- RoundedCornersTransformation() : 圆角变换
加载圆形、圆角图:
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
transformations(CircleCropTransformation())
scale(Scale.FILL)
}
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
transformations(RoundedCornersTransformation(40f))
}
高斯模糊处理:
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
transformations(BlurTransformation(applicationContext, 5f, 10f))
scale(Scale.FILL)
}
灰色变换
imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
transformations(GrayscaleTransformation())
}
加载Gif图
//创建 gif ImageLoader 实例
val imageLoader = ImageLoader.Builder(applicationContext)
.componentRegistry {
if (SDK_INT >= 28) {
add(ImageDecoderDecoder(applicationContext))
} else {
add(GifDecoder())
}
}.build()
//设置全局唯一实例
Coil.setImageLoader(imageLoader)
imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp")
}
监听下载过程
imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp") {
listener(
onStart = { request ->
Log.i("minfo", "onStart")
},
onSuccess = { request, metadata ->
Log.i("minfo", "onSuccess")
},
onCancel = { request ->
Log.i("minfo", "onCancel")
},
onError = { request, throwable ->
Log.i("minfo", "onError")
}
)
}
取消下载:
val disposable = imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp")
disposable.dispose()
自定义属性
底层使用okhttp作为网络请求工具,并使用缓存
val okHttpClient = OkHttpClient.Builder()
.cache(CoilUtils.createDefaultCache(this))
.build()
val imageLoader = ImageLoader.Builder(this)
.availableMemoryPercentage(0.2)
.diskCachePolicy(CachePolicy.ENABLED) //磁盘缓策略 ENABLED、READ_ONLY、WRITE_ONLY、DISABLED
.crossfade(true) //淡入淡出
.crossfade(1000) //淡入淡出时间
.okHttpClient { //设置okhttpClient实例
okHttpClient
}.build()
Coil.setImageLoader(imageLoader)
availableMemoryPercentage 设置用于此 ImageLoader 的内存缓存和位图池的可用内存百分比;
memoryCachePolicy 内存缓存策略,有4中策略;
diskCachePolicy 磁盘缓存策略,方式和内存策略一致;
缓存策略有如下几种:
CachePolicy.ENABLED : 可读可写
CachePolicy.READ_ONLY : 只读
CachePolicy.WRITE_ONLY : 只写
CachePolicy.DISABLED : 不可读不可写,即禁用
参考:
https://blog.csdn.net/zhaoyanjun6/article/details/122040645
https://blog.csdn.net/weixin_42324979/article/details/117933094
网友评论