Я делаю превью вроде 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)