【发布时间】:2019-03-22 22:16:00
【问题描述】:
我有一个自定义 Glide 模型来计算图像的中心裁剪。相同的模型用于从服务器和本地存储中获取图像。
这是模型界面:
interface CenterCropImageInformation {
fun getCenterCropUri(context: Context, @Px width: Int, @Px height: Int): Uri
}
这是它的 ModelLoader,它从 BaseGlideUrlLoader 扩展而来:
class CenterCropImageInformationLoader private constructor(
context: Context,
concreteLoader: ModelLoader<GlideUrl, InputStream>,
modelCache: ModelCache<CenterCropImageInformation, GlideUrl>?
) : BaseGlideUrlLoader<CenterCropImageInformation>(concreteLoader, modelCache) {
private val applicationContext: Context = context.applicationContext
override fun getUrl(
model: CenterCropImageInformation, width: Int,
height: Int, options: Options
): String {
return model.getCenterCropUri(applicationContext, width, height).toString()
}
override fun handles(centerCropImageInformation: CenterCropImageInformation): Boolean {
return true
}
/**
* The default factory for [CenterCropImageInformation]s.
*/
class Factory(
private val applicationContext: Context,
private val modelCache: ModelCache<CenterCropImageInformation, GlideUrl>?
) : ModelLoaderFactory<CenterCropImageInformation, InputStream> {
override fun build(
multiFactory: MultiModelLoaderFactory
): ModelLoader<CenterCropImageInformation, InputStream> {
val modelLoader = multiFactory.build(GlideUrl::class.java, InputStream::class.java)
return CenterCropImageInformationLoader(applicationContext, modelLoader, modelCache)
}
override fun teardown() {}
}
}
这适用于具有http/https 方案的图像,但不适用于file 方案 - 用于从本地设备存储加载图像的方案。
我查看了 Glide 的源代码,最接近的 ModelLoader 听起来像是一个选项是UriLoader,但它不支持自定义模型的问题。仅支持Uri。
最佳解决方案是使用与 Glide 捆绑在一起的预先存在的 ModelLoader,但除非我错过了它,否则我找不到适合我需要的任何东西。如果真是这样的话,我该如何实现这样的ModelLoader呢?
【问题讨论】:
标签: android android-image android-glide