Кэширование палитры, сгенерированной из растрового изображения - PullRequest
0 голосов
/ 16 мая 2018

Я пишу приложение, которое отображает сетку изображений в 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 и, если возможно, как это сделать?

Заранее спасибо.

...