详解Android官推Kotlin-First的图片加载库( 二 )

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 主要提供了这几个图片变换的效果:
Tranformation
功能
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)    }}


推荐阅读