Я пишу приложение, которое отображает сетку изображений в RecyclerView
. Изображения загружаются с помощью Glide v4, используя Uri содержимого этого изображения из MediaStore.
Для каждого изображения соответствующий цвет Palette
создается с использованием PaletteBitmapTranscoder
, пользовательской реализации ResourceTranscoder
, согласно рекомендациям официальной Glide документации :
data class PaletteBitmap(val palette: Palette, val bitmap: Bitmap)
class PaletteBitmapResource(
private val paletteBitmap: PaletteBitmap,
private val bitmapPool: BitmapPool
) : Resource<PaletteBitmap> {
override fun getResourceClass() = PaletteBitmap::class.java
override fun get() = this.paletteBitmap
override fun getSize() = Util.getBitmapByteSize(paletteBitmap.bitmap)
override fun recycle() = bitmapPool.put(paletteBitmap.bitmap)
}
class PaletteBitmapTranscoder(
private val bitmapPool: BitmapPool
) : ResourceTranscoder<Bitmap, PaletteBitmap> {
override fun transcode(toTranscode: Resource<Bitmap>, options: Options): Resource<PaletteBitmap> {
val bitmap = toTranscode.get()
val palette = Palette.from(bitmap).generate()
val result = PaletteBitmap(palette, bitmap)
return PaletteBitmapResource(result, bitmapPool)
}
}
Вот как PaletteBitmapTranscoder настроен в GlideModule:
@GlideModule
class MyGlideModule : AppGlideModule() {
override fun isManifestParsingEnabled() = false
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
// Calculate the color Palette associated with the loaded Bitmap
registry.register(
Bitmap::class.java, PaletteBitmap::class.java,
PaletteBitmapTranscoder(glide.bitmapPool)
)
}
}
Вот как я загружаю изображения в свой RecyclerView.Adapter
:
GlideApp.with(fragment).`as`(PaletteBitmap::class.java)
.load(model.iconUri)
.into(object : ImageViewTarget<PaletteBitmap>(imageView) {
override fun setResource(resource: PaletteBitmap?) {
if (resource != null) {
useThatPalette(resource.palette)
super.view.setImageBitmap(resource.bitmap)
}
}
}
Это работает, как ожидалось.
Вопрос
Я читал, что Glide кэширует изображения, которые были загружены на диск и в кэш-память Поскольку я загружаю много изображений в RecyclerView
и генерирую цвет Palette
для каждого, я бы хотел, чтобы Glide сохранил экземпляры Palette
в кэше вместе с соответствующими Bitmap
.
Похоже, Glide уже помещает PaletteBitmap
экземпляров в кэш-память, но я бы хотел поместить их также в кэш-память диска, чтобы каждый Palette
генерировался только один раз для каждого Bitmap
.
Я слышал о Glide ResourceEncoder
, но не могу понять, как использовать его в моем случае.
Можно ли хранить транскодированные ресурсы в дисковом кеше Glide и, если возможно, как это сделать?
Заранее спасибо.