android - Glide 模块加载自定义尺寸的 url 图片,带有路径和任何 uri 处理

标签 android android-glide

我已经关注了这个 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/

相关文章:

android - FCM 通知不显示在后台弹出的通知

android - 使用 Signature Android glide 查找缓存图像

android - 在 Glide 中制作正方形图像,然后将其四舍五入

android - ScrollView 截掉部分布局

java - 在警报对话框中添加下拉菜单或选择日期选项

java - GridView 滚动条 : erratic behaviour when dynamically adding images

android - android中 "ViewHolder"类的问题

Android,将 BitmapPool 与 Glide 库一起使用

android - 如何让 Glide 保持连接?

android - NoClassDefFoundError 与 Kotlin 中的 ?.let{} block