gpt4 book ai didi

java - Glide 4 - 特定调用的 ResourceDecoder

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:04 24 4
gpt4 key购买 nike

在浏览了所有 Glide 文档和 StackOverflow 问答之后,我找不到任何关于在版本 4 中为单个 Glide 调用应用资源解码器的信息。

在 Glide 3 版本中,我们可以这样做:

Glide.with(imagePreview.context)
.load(mediaItem.path)
.asBitmap()
.decoder(decoderWithDownSampleAtMost(imagePreview.context))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(false)
.dontAnimate()
.into(target)
private fun decoderWithDownSampleAtMost(ctx: Context): GifBitmapWrapperResourceDecoder {
return GifBitmapWrapperResourceDecoder(
ImageVideoBitmapDecoder(StreamBitmapDecoder(Downsampler.AT_MOST,
Glide.get(ctx).bitmapPool,
DecodeFormat.DEFAULT),
FileDescriptorBitmapDecoder(ctx)),
GifResourceDecoder(ctx),
Glide.get(ctx).bitmapPool)
}

在版本 4 中,我知道我们可以使用 AppGlideModule 来自定义 ResourceDecoder

@GlideModule
class MyAppGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(String::class.java, Bitmap::class.java, GalleryDecoder(context))
}
}

但是,这适用于所有 Glide 调用。我怎样才能让 ResourceDecoder 表现得像 v3:应用到单个调用的能力?


更新:在咨询了 Glide Github Issues 之后,我能够为这个问题制定一个解决方案 https://github.com/bumptech/glide/issues/3522

基本上,我需要创建一个自定义 Option 并使用它来确定是否会触发我的自定义 ResourceDecoder。这是我的示例:

  • 普通 AppGlideModule
@GlideModule
class MyAppGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(Any::class.java, Bitmap::class.java, MainActivity.GalleryDecoder(context, glide.bitmapPool))
}
}
  • 在我的 Activity 中:
class MainActivity : AppCompatActivity() {

companion object {
val GALLERY_DECODER: Option<Boolean> = Option.memory("abc")
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

GlideApp.with(this)
.asBitmap()
.load("link_or_path_here")
.apply(option(GALLERY_DECODER, true))
.into(image_view)

}
}
  • 我的GalleryDecoder:
open class GalleryDecoder(
private val context: Context,
private val bitmapPool: BitmapPool
) : ResourceDecoder<Any, Bitmap> {

override fun decode(source: Any, width: Int, height: Int, options: Options): Resource<Bitmap>? {
return BitmapResource.obtain(BitmapFactory.decodeResource(context.resources, R.drawable.giphy), bitmapPool)
}

override fun handles(source: Any, options: Options): Boolean = options.get(GALLERY_DECODER) ?: false

}

就是这样,如果你不想使用 GalleryDecoder,只需从 Glide 加载中删除 .apply(option(GALLERY_DECODER, true)) 即可。干杯!

最佳答案

我认为你可以这样做:

GlideApp.with(mContext)
// TRY With below line....
.setDefaultRequestOptions(new GlideOptions().decode(Class<T> class))
.load(R.drawable.ic_loader)
.into(imageView);

我认为你必须传递你的类对象。我没有尝试过,但我认为它会奏效。

关于java - Glide 4 - 特定调用的 ResourceDecoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54360199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com