Как избежать мерцания изображения с помощью Glide - PullRequest
0 голосов
/ 25 мая 2020

Я делаю превью вроде youtube / netflix в своем приложении.

Для этого у меня есть спрайт миниатюры (большое изображение, состоящее из множества маленьких, соответствующих таймфрейму). Используя Glide и Custom Transformation, мне удалось выделить эти таймфреймы и отобразить их во фрейме над моим progressbar.

Несмотря на то, что я заранее загрузил и создал большие пальцы, когда они отображаются впервые, переход между изображениями заставляет их мерцать.

Я создал imgur, чтобы показать вам поведение: Пример в видео

Я искал stackoverflow и нашел этот пост и Glide issues и выяснилось, что это связано с:

Мерцание вызвано быстрой последовательной загрузкой изображений в один и тот же вид.

Я не понимаю, как я могу улучшить текущее поведение, все большие пальцы создаются до того, как exoplayer начнет играть, и Glide нужно только их отобразить.

вот мой код:

Пользовательское преобразование :

private const val MAX_LINES = 7
private const val MAX_COLUMNS = 7
private const val THUMBNAILS_EACH = 5000 // milliseconds

class GlideThumbnailTransformationFull(position: Long) : BitmapTransformation() {

    private val x: Int
    private val y: Int

    init {
        val square = position.toInt() / THUMBNAILS_EACH
        y = square / MAX_COLUMNS
        x = square % MAX_COLUMNS
    }

    override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
        val width = toTransform.width / MAX_COLUMNS
        val height = toTransform.height / MAX_LINES

        return Bitmap.createBitmap(toTransform, x * width, y * height, width, height)
    }

    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        val data: ByteArray = ByteBuffer.allocate(8).putInt(x).putInt(y).array()
        messageDigest.update(data)
    }

    override fun hashCode(): Int {
        return (x.toString() + y.toString()).hashCode()
    }

    override fun equals(other: Any?): Boolean {
        if (other !is GlideThumbnailTransformationFull) {
            return false
        }
        return other.x == x && other.y == y
    }
}

для загрузки изображения, которое я использую

GlideApp.with(imageView)
            .load(thumbnailsUrl)
            .dontAnimate()
            .skipMemoryCache(false)
            .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
            .transform(GlideThumbnailTransformationFull(currentPosition))
            .into(imageView)

1 Ответ

0 голосов
/ 25 мая 2020

https://futurestud.io/tutorials/glide-caching-basics Посмотрите на это. Это дает подробное представление о кешировании и других вещах в glide

Glide.with(imageView)
    .load(url)
    .transition(withCrossFade(factory))
    .apply(RequestOptions().placeholder(placeholder))
    .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.ALL))
    .into(imageView)
...