翻译:English
Fetcher 用于从 uri 获取数据,返回 FetchResult,交由 BitmapDecoder 或 DrawableDecoder 使用。
Sketch 对支持的每一种 uri 都有对应的 Fetcher 实现,共有如下几种:
- AssetUriFetcher:从 app 的 assets 目录加载图片
- Base64UriFetcher:从 uri 本身加载 base 64 格式的图片
- ContentUriFetcher:从 ContentResolver 加载图片
- FileUriFetcher:从本地文件加载图片
- HttpUriFetcher:从 http uri 加载图片
- ResourceUriFetcher:从 Android Resource 中加载图片
- AppIconUriFetcher:从已安装 app 加载其图标,了解更多
首先需要实现 Fetcher 接口定义你的 Fetcher 和它的 Factory,如下:
class MyFetcher : Fetcher {
override suspend fun fetch(): Result<FetchResult> {
// 在这里解析你的 uri,获取数据
}
companion object {
const val MY_SCHEME = "myUri"
}
class Factory : Fetcher.Factory {
override fun create(sketch: Sketch, request: ImageRequest): MyFetcher? {
return if (request.uriString.startWith("$MY_SCHEME://")) {
MyFetcher()
} else {
null
}
}
}
}
然后通过 addFetcher 方法注册,如下:
/* 为所有 ImageRequest 注册 */
class MyApplication : Application(), SketchFactory {
override fun createSketch(): Sketch {
return Sketch.Builder(this).apply {
components {
addFetcher(MyFetcher.Factory())
}
}.build()
}
}
/* 为单个 ImageRequest 注册 */
imageView.displayImage(context, "myUri://sample.jpeg") {
components {
addFetcher(MyFetcher.Factory())
}
}