El control de la animación GIF con Glide

Serge Ardovic:

Estoy usando Glidela 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 Javay Kotlin.

Serge Ardovic:

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 Javaque 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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=318129&siteId=1
Recomendado
Clasificación