Glide 模块加载具有路径和任何 uri 处理的自定义尺寸的 url 图像

Dam*_*tes 5 android android-glide

我遵循了本教程,其中声明了一个自定义 Glide 模块,用于根据ImageView大小从服务器加载不同的图像大小。我还查看了这个Glide wiki,它也解释了同样的事情。

但是,只有当您发送到自定义模块的字符串是 http/https url 时,教程和 Glide wiki 上的实现才有效。我如何修改此自定义模块或创建一个新模块以处理所有其他类型(String、Uri、int 等,如 Glide.load() 所做的那样)并保留教程中提供的功能?

Dam*_*tes -1

不要使用 来注册新ModelLoader数据append()(它处理新类型的数据),而是使用 来注册它prepend()(它处理现有数据的子集),如果您的 ModelLoader 失败,您确实希望回退到 Glide\xe2\x80\x99s 默认行为。因此,不要创建新的Glide输入数据(在教程中名为CustomImageSizeModelFutureStudio),而是告诉 Glide(在 a 的情况下String)检查您是否要修改String并创建您的 url,或者让Glide他在不修改 的情况下完成工作String。这是我在 中的实现Kotlin。在这种情况下,如果您的输入是“https://...”,它将请求您的自定义网址。如果您的输入是“content://...”,您ModelLoader将因该handles()方法而失败,并且Glide会完成它的工作。

\n\n

实施AppGlideModule

\n\n
@GlideModule\nclass MyGlideModule : AppGlideModule() {\n    override fun registerComponents(context: Context?, glide: Glide?, registry: Registry?) {\n        registry?.prepend(String::class.java, InputStream::class.java, CustomImageSizeUrlLoaderFactory())\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

实施ModelLoaderFactory

\n\n
class CustomImageSizeUrlLoaderFactory : ModelLoaderFactory<String, InputStream> {\n    private val modelCache = ModelCache<String, GlideUrl>(500)\n\n    override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<String, InputStream> {\n        val modelLoader = multiFactory.build(GlideUrl::class.java, InputStream::class.java)\n        return CustomImageSizeUrlLoader(modelLoader, modelCache)\n    }\n\n    override fun teardown() {\n\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

实施BaseGlideUrlLoader

\n\n
class CustomImageSizeUrlLoader(concreteLoader: ModelLoader<GlideUrl, InputStream>, modelCache: ModelCache<String, GlideUrl>?) : BaseGlideUrlLoader<String>(concreteLoader, modelCache) {\n    override fun getUrl(baseImageUrl: String, width: Int, height: Int, options: Options?): String {\n        return  baseImageUrl + "?w=" + width + "&h=" + height;\n    }\n\n    override fun handles(model: String): Boolean {\n        return baseImageUrl.startsWith("http://")\n                || baseImageUrl.startsWith("https://")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并像平常一样调用你的 Glide,而不是像教程那样。

\n