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

Mappers、Fetchers
外部在调用 load() 时,传入的 String 参数既可能指向本地资源文件,也可能指向网络图片,Mappers 和 Fetchers 搭配使用,可以对资源类型进行区分,举个例子:
imageView.load("android.resource://example.package.name/drawable/image")imageView.load("https://www.example.com/image.jpg")StringMapper 会将传入的 String 转换为对应的 Uri 。
internal class StringMapper : Mapper<String, Uri> {    override fun map(data: String) = data.toUri()}ResourceUriFetcher 会判断 Uri 的 scheme 类型是否为 android.resource,是的话代表本地资源文件,而 HttpUriFetcher 则判断 Uri 的 scheme 是否为 http 或 https,是的话代表网络图片 。
internal class HttpUriFetcher(callFactory: Call.Factory) : HttpFetcher<Uri>(callFactory) {    override fun handles(data: Uri) = data.scheme == "http" || data.scheme == "https"    override fun key(data: Uri) = data.toString()    override fun Uri.toHttpUrl(): HttpUrl = HttpUrl.get(toString())} Mapper
作用
FileUriMapper
将 Uri 转换为 File
StringMapper
将 String 转换为 Uri
ResourceIntMapper
将 @DrawableRes Int 转换为 Resource Uri
ResouceUriMapper
将具有资源名称的 android.resource Uri 映射到包含其资源 ID 的 Uri
Decoders
Android 支持了很多图像格式,但也有很多它不支持的格式(例如:Gif、SVG、视频帧等),所以 Coil 便提供了对应的拓展库 。
① Gif(GifDecoder 支持所有 API 级别,但速度较慢,ImageDecoderDecoder 的加载速度快,但仅在 API 28 及更高版本可用)
implementation("io.coil-kt:coil-gif:1.1.1")val imageLoader = ImageLoader.Builder(context)    .componentRegistry {        if (SDK_INT >= 28) {            add(ImageDecoderDecoder())        } else {            add(GifDecoder())        }    }    .build()② SVG(如果请求的 MIME 类型是 image/svg+xml,则会自动检测并解码所有 SVG)
implementation("io.coil-kt:coil-svg:1.1.1")val imageLoader = ImageLoader.Builder(context)    .componentRegistry {        add(SvgDecoder(context))    }    .build()③ 视频帧(仅支持 File 和 Uri)
implementation("io.coil-kt:coil-video:1.1.1")val imageLoader = ImageLoader.Builder(context)    .componentRegistry {         add(VideoFrameFileFetcher())         add(VideoFrameUriFetcher())    }    .build()



推荐阅读