Estoy usando Glide
la carga de animación animación GIF en ImageView
. Funciona según lo previsto, un bucle indefinidamente:
GlideApp.with(getContext())
.load(R.raw.my_gif_animation)
.into(this)
Quiero añadir vibración cada vez que el ciclo comienza de animación GIF (o extremos), pero no pude encontrar cualquier contador de devolución de llamada, oyente o el marco, que podría utilizar para aprender cuando se ha iniciado el ciclo de animación (o terminado). Respuestas bienvenida tanto en Java
y Kotlin
.
He encontrado una solución al problema, resulta que tenemos acceso a los marcos de la animación GIF después de que el recurso se ha cargado. Usando esta información dentro de una ejecución Thread
, pude no sólo para escuchar al final / inicio de la animación pero el evento para ajustar con mucha precisión el tiempo con respecto a la imagen de la animación.
Aquí está mi código de trabajo en Kotlin
(en la Java
que sería muy similar):
GlideApp.with(getContext())
.asGif()
.load(R.raw. my_gif_animation)
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
.listener(object : RequestListener<GifDrawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any,
target: Target<GifDrawable>,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: GifDrawable?,
model: Any,
target: Target<GifDrawable>,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
myThread = Thread(Runnable {
while (true) {
if (resource?.isRunning == true) {
if (resource.frameIndex == 10).toInt()) {
// This code will be executed every time the 10th frame of the GIF animation is played..
}
if (Thread.interrupted()) break
}
}
})
myThread?.start()
return false
}
})
.into(this)