ImageRequest
ImageRequest 为 ImageLoader 加载图片提供所有的必要信息,同时我们也可以使用自定义的 Target 进行处理 。
val request = ImageRequest.Builder(context) .data("https://www.example.com/image.jpg") .target { drawable -> // Handle the result. } .build()context.imageLoader.enqueue(request)
ImageRequest 基于 Builder 模式来进行创建,包含了加载图片的各个配置项,这里重点看下最常用的配置项 。
作用
context
外部传入的 Context,一般是 ImageView 包含的 Context
data
图片的地址
【详解Android官推Kotlin-First的图片加载库】target
图片加载之后的处理类
memoryCachePolicy
内存缓存策略
diskCachePolicy
磁盘缓存策略
networkCachePolicy
网络缓存策略
decoder
图片解码器
fetcher
将图片地址转换成 BufferedSource 或 Drawable
lifecycle
一般是对应 Activity 或 Fragment 的 Lifecycle
Disposable
Disposable 是调用 load() 方法之后的返回值,主要是用于取消图片加载:
interface Disposable { /** * 如果图片加载请求已经完成或者取消,则返回 true */ val isDisposed: Boolean /** * 取消正在进行的图片加载请求以及释放相关的资源,而且该方法是幂等的 */ fun dispose() /** * 非阻塞式地等待任务结束 */ @ExperimentalCoilApi suspend fun await()}
图片变换图片变换是图片加载库中很常见的功能,Coil 将其抽象成 Transformation 接口,可以看到在 transform() 方法中有一个 BitmapPool 参数,这是因为在实现图形变换的时候往往需要一个 Bitmap,此时可以直接在 BitmapPool 中获取,从而复用已有的 Bitmap 。
interface Transformation { fun key(): String suspend fun transform(pool: BitmapPool, input: Bitmap, size: Size): Bitmap}imageView.load("https://www.example.com/image.jpg") { transformations(CircleCropTransformation())}
Coil 主要提供了这几个图片变换的效果:功能
BlurTransformation
高斯模糊
CircleCropTransformation
圆形裁剪
GrayscaleTransformation
图片置灰
RoundedCornersTransformation
添加圆角
功能拓展Coil 在提供了很多必要功能的基础上,预留了很多的拓展点给开发者实现自定义 。Coil 的图片加载主要包括四个主要的模块:
作用
Interceptors
拦截器,可以对图片加载请求进行观察、转换和重试
Mappers
映射器,实现不同数据类型之间的转换
Fetchers
抓取器,将图片地址转换成 BufferedSource 或 Drawable
Decoders
解码器,实现各种图像格式的解码
Interceptors
Coil 的 Interceptor 无疑是借鉴了 okhttp 的设计思路,极大方便了后续的功能拓展,例如我们可以给 Coil 添加一个自定义的缓存层:
class CustomCacheInterceptor( private val context: Context, private val cache: LruCache<String, Drawable>) : Interceptor { override suspend fun intercept(chain: Interceptor.Chain): ImageResult { val value = cache.get(chain.request.data.toString()) if (value != null) { return SuccessResult( drawable = value.bitmap.toDrawable(context), request = chain.request, metadata = TODO() ) } return chain.proceed(chain.request) }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- oracle连接查询详解
- 一篇详解Redis -- 延时队列
- LVS三种模式的实现原理、配置及优点缺点详解
- MySQL Explain详解,添加索引sql优化
- Nginx配置详解
- Raid 0、Raid 1、Raid 5、Raid 10、热备盘配置步骤详解
- 朴树盆景制作和养护方法详解
- 让Android更安全 谷歌推荐开发者使用Rust编写系统代码
- python基础——数据结构栈的详解
- SpringCloud Zookeeper配置中心详解