Glide 4 - ResourceDecoder по конкретному вызову
Изучив всю документацию Glide и вопросы и ответы Stackru, я не могу найти никакой информации относительно применения декодера ресурсов для одного вызова Glide в версии 4.
В версии 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
просто удали .apply(option(GALLERY_DECODER, true))
от скольжения нагрузки. Ура!
1 ответ
Я думаю, что вы можете сделать с:
GlideApp.with(mContext)
// TRY With below line....
.setDefaultRequestOptions(new GlideOptions().decode(Class<T> class))
.load(R.drawable.ic_loader)
.into(imageView);
Я думаю, что вы должны передать свой объект класса. Я не пробовал, но думаю, что это сработает.