我已按照此tutorial声明自定义Glide模块,根据ImageView
大小从服务器加载不同的图像尺寸。我还看了this Glide wiki,它解释了相同的内容。
但是,如果您发送到自定义模块的字符串是http / https网址,则教程和Glide wiki上的实现才有效。如何修改此自定义模块或创建一个新模块以便处理所有其他类型(String,Uri,int等,如Glide.load()所做)并保持教程中提供的功能?
答案 0 :(得分:-1)
不是使用处理新类型数据的ModelLoader
注册新的append()
,而是使用prepend()
注册它,该Glide
处理现有数据的子集,而您希望回退到这些数据的子集如果您的ModelLoader失败,Glide的默认行为。因此,不要创建新的CustomImageSizeModelFutureStudio
输入数据(在名为String
的教程中),请告诉Glide,如果是String
,请检查是否要修改Glide
并创建您的网址或让String
无需修改Kotlin
即可完成工作。这是我在ModelLoader
中的实现。在这种情况下,如果您的输入是“https:// ....”,它将请求您的自定义网址。如果您的输入是“content:// ...”,则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://")
}
}
的实施:
(cd /usr/testing/member; find . -maxdepth 1 \( ! -name . -a ! -name public \) -exec echo rm -fr {} +)
按照通常的做法调用你的Glide,而不是像教程那样。
答案 1 :(得分:-2)
要加载不同尺寸的图像,您可以使用滑翔的默认方法open
请查看以下代码段,了解不同尺寸的装载图片。
override
如果您还想保持宽高比,可以使用GlideApp
.with(context)
.load(url)
.override(customwidth, customheight) // resizes the image to these dimensions (in pixel). resize does not respect aspect ratio
.into(imageViewResize);
或fitCenter()
。