Fresco: Reproduce un GIF animado solo una vez

Creado en 24 jun. 2015  ·  21Comentarios  ·  Fuente: facebook/fresco

Configuré la animación para que se ejecute solo UNA VEZ, pero no es útil ... ¿qué hago a continuación?

enhancement

Comentario más útil

para una solución ...

.setAutoPlayAnimations(false)
.setControllerListener(new BaseControllerListener<ImageInfo>() {
    <strong i="6">@Override</strong>
    public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
        if (animatable != null) {
            try {
              Field field = AnimatedDrawable.class.getDeclaredField("mTotalLoops");
              field.setAccessible(true);
              field.set(animatable, 1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            animatable.start();
        }
    }
})

para fresco v0.10.0 +

...
Field field = AbstractAnimatedDrawable.class.getDeclaredField("mTotalLoops");
...

Todos 21 comentarios

¿No funcionó esto? http://frescolib.org/docs/animations.html#playing -animations-manualmente

¿Qué pasó exactamente? ¿Es la imagen un GIF o un WebP?

Es una imagen GIF. Funciona, pero solo quiero que se reproduzca una vez. Uso este código en mi proyecto:

Uri uri;
DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setUri(uri)
    .setAutoPlayAnimations(true)
    .build();
mSimpleDraweeView.setController(controller);

Configuré la animación para que se ejecute solo una vez en PS, pero en el proyecto la reproducción de la imagen GIF se repite ... Solo quiero que se reproduzca una vez ... ¿Qué necesito configurar?

Siga las instrucciones en el enlace que publiqué arriba.

No estoy seguro de que la documentación responda a la pregunta.

¿Hay alguna forma de que el GIF se anime solo una vez, o de que algunos BaseControllerListener comprendan en qué parte de la animación se encuentra en su propia secuencia?

Escribir un BaseControllerListener permite iniciar y detener una animación en función de cualquier evento externo, pero no parece haber una forma de que el controlador comprenda cuándo el GIF animado ya se ha ejecutado más de una vez.

Esto podría ser increíblemente útil si intenta implementar una devolución de llamada al final de una animación determinada.

EDITAR: Posiblemente relacionado con esta solicitud de función: https://github.com/facebook/fresco/issues/502

+1

+1

¿cómo jugar el gif una vez? Podría encontrar la manera de hacerlo. por favor comparte la forma de hacerlo

para una solución ...

.setAutoPlayAnimations(false)
.setControllerListener(new BaseControllerListener<ImageInfo>() {
    <strong i="6">@Override</strong>
    public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
        if (animatable != null) {
            try {
              Field field = AnimatedDrawable.class.getDeclaredField("mTotalLoops");
              field.setAccessible(true);
              field.set(animatable, 1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            animatable.start();
        }
    }
})

para fresco v0.10.0 +

...
Field field = AbstractAnimatedDrawable.class.getDeclaredField("mTotalLoops");
...

.setAutoPlayAnimations (falso)
.setControllerListener (nuevo BaseControllerListener() {
@Anular
public void onFinalImageSet (String id, ImageInfo imageInfo, Animatable animatable) {
if (animable! = null) {
tratar {
Field field = AnimatedDrawable.class.getDeclaredField ("mTotalLoops");
field.setAccessible (verdadero);
field.set (animable, 1);
} captura (Excepción e) {
e.printStackTrace ();
}
animatable.start ();
}
}
})

@ m0er no funcionó

@wswenyue pruebe AbstractAnimatedDrawable en lugar de AnimatedDrawable. Hay un poco de jerarquía de clases de cambio.

Funcionó, muchas gracias @ m0er

AbstractAnimatedDrawable puede funcionar normalmente y reproducirse una vez

 public void onFinalImageSet (
 ID de cadena,
 @Nullable com.facebook.imagepipeline.image.ImageInfo imageInfo,
 @Nullable Animatable anim) {
 if (anim! = null) {
 // 其他 控制 逻辑
 AnimatedDrawable an = (AnimatedDrawable) anim;
 ValueAnimator v = an.createValueAnimator ();
 v.setRepeatCount (0);
 // 其他 操作
 v.start ();
 }
 }

@liyuehui es correcto, puede proporcionar animadores de valor para modificar el recuento de repeticiones. Buen truco :)

@oprisnik El método no funciona en 1.3.0, causará ClassCastException.
com.facebook.imagepipeline.animated.base.AnimatedDrawableSupport cannot be cast to com.facebook.imagepipeline.animated.base.AnimatedDrawable

El problema aquí no es la versión, sino que está transmitiendo a AnimatedDrawable , que será AnimatedDrawableSupport en versiones anteriores de Android. Debería funcionar si lo lanza a AbstractAnimatedDrawable lugar.

@guoxiaoxing

 si se agrega "soporte-base-animado"
 dependencias {
 compilar 'com.facebook.fresco: soporte-base animado: xxx' 
 // compilar (nombre: 'soporte-base-animado', ext: 'aar')
 }
 /////////////////////
 public void onFinalImageSet (
 ID de cadena,
 @Nullable imageInfo,
 @Nullable Animatable anim) {
 if (anim! = null) {
 // 其他 控制 逻辑
 com.facebook.imagepipeline.animated.base.AnimatedDrawableSupport an = (com.facebook.imagepipeline.animated.base.AnimatedDrawableSupport) anim;
 com.nineoldandroids.animation.ValueAnimator v = an
 .createValueAnimator ();
 v.setRepeatCount (0);
 v.start ();
 }
 }

 de lo contrario, no se agrega "soporte-base-animado"

 public void onFinalImageSet (
 ID de cadena,
 @Nullable imageInfo,
 @Nullable Animatable anim) {
 if (anim! = null) {
 // 其他 控制 逻辑
 com.facebook.imagepipeline.animated.base.AnimatedDrawable an = (com.facebook.imagepipeline.animated.base.AnimatedDrawable) anim;
 android.animation.ValueAnimator v = an
 .createValueAnimator ();
 v.setRepeatCount (0);
 v.start ();
 }
 }



@liyuehui gracias, me ahorras tiempo.

ahora para fresco 1.5.0+, ¿cómo hacer esto?

Consulte https://github.com/facebook/fresco/issues/1863 para obtener una solución.

@liyuehui muchas gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

qiiyue picture qiiyue  ·  4Comentarios

satyarths picture satyarths  ·  3Comentarios

liubaoyua picture liubaoyua  ·  3Comentarios

rafaelekol picture rafaelekol  ·  4Comentarios

sungerk picture sungerk  ·  3Comentarios