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())}
作用
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()
推荐阅读
- oracle连接查询详解
- 一篇详解Redis -- 延时队列
- LVS三种模式的实现原理、配置及优点缺点详解
- MySQL Explain详解,添加索引sql优化
- Nginx配置详解
- Raid 0、Raid 1、Raid 5、Raid 10、热备盘配置步骤详解
- 朴树盆景制作和养护方法详解
- 让Android更安全 谷歌推荐开发者使用Rust编写系统代码
- python基础——数据结构栈的详解
- SpringCloud Zookeeper配置中心详解