我已经关注了这个 tutorial它被声明为自定义 Glide 模块,根据 ImageView
大小从服务器加载不同大小的图像。我也看过this Glide wiki 解释相同。
但是教程和 Glide wiki 上的实现只有在您发送到自定义模块的字符串是 http/https url 时才有效。我如何修改此自定义模块或创建一个新模块以处理所有其他类型(String、Uri、int 等,如 Glide.load() 所做的那样)并保留教程中介绍的功能?
最佳答案
不是使用处理新数据类型的 append()
注册新的 ModelLoader
,而是使用 prepend()
注册它,这处理现有数据的子集,如果您的 ModelLoader 失败,您确实希望退回到 Glide 的默认行为。因此,在 String
的情况下,不要创建新的 Glide
的输入数据(在名为 CustomImageSizeModelFutureStudio
的教程中),而是告诉 Glide , 检查您是否要修改 String
并创建您的 url 或让 Glide
在不修改 String
的情况下完成他的工作。这是我在 Kotlin
中的实现。在这种情况下,如果您的输入是“https://...”,它将请求您的自定义 url。如果您的输入是“content://...”,您的 ModelLoader
将因 handles()
方法而失败,而 Glide
将执行此操作工作。
AppGlideModule
的实现:
@GlideModule
class MyGlideModule : AppGlideModule() {
override fun registerComponents(context: Context?, glide: Glide?, registry: Registry?) {
registry?.prepend(String::class.java, InputStream::class.java, CustomImageSizeUrlLoaderFactory())
}
}
ModelLoaderFactory
的实现:
class CustomImageSizeUrlLoaderFactory : ModelLoaderFactory<String, InputStream> {
private val modelCache = ModelCache<String, GlideUrl>(500)
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<String, InputStream> {
val modelLoader = multiFactory.build(GlideUrl::class.java, InputStream::class.java)
return CustomImageSizeUrlLoader(modelLoader, modelCache)
}
override fun teardown() {
}
}
BaseGlideUrlLoader
的实现:
class CustomImageSizeUrlLoader(concreteLoader: ModelLoader<GlideUrl, InputStream>, modelCache: ModelCache<String, GlideUrl>?) : BaseGlideUrlLoader<String>(concreteLoader, modelCache) {
override fun getUrl(baseImageUrl: String, width: Int, height: Int, options: Options?): String {
return baseImageUrl + "?w=" + width + "&h=" + height;
}
override fun handles(model: String): Boolean {
return baseImageUrl.startsWith("http://")
|| baseImageUrl.startsWith("https://")
}
}
并像往常一样调用 Glide,而不是像教程那样。
关于android - Glide 模块加载自定义尺寸的 url 图片,带有路径和任何 uri 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419256/