Cómo restablecer AnimationDrawable

Tengo que animar un cronómetro de cuenta atrás circular y lo estoy haciendo animando el fondo de un ImageView usando AnimationDrawable (cada imagen tiene la porción correspondiente del círculo eliminado). El problema es que el usuario tiene la capacidad de pausar esta animación, por lo que tengo que volver a cargar la animación, pero luego aparece un problema. He intentado fijar la animación a null, fijando el fondo del ImageView a null, fijando la visibilidad de la animación, pero prácticamente nada ayudó, porque el número de marcos sigue siendo igual. Tengo que encontrar una solución para eliminar todos los marcos y agregar nuevos o para restablecer toda la animación al estado predeterminado.

Paso 1: inicializar la animación (el índice de marco inicial es 0)

timerView.setBackgroundResource(R.drawable.timer_switch); timerAnimation = (AnimationDrawable)timerView.getBackground(); System.out.println("Number of frames: " + timerAnimation.getNumberOfFrames()); for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex++) { if (frameIndex < 10) { uri = "drawable/timer_0000" + frameIndex; } else { uri = "drawable/timer_000" + frameIndex; } imageResourceId = getResources().getIdentifier(uri, null, getPackageName()); timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration); } 

Paso 2 – aquí está la parte difícil en la que no sé qué hacer. Cosas que he probado:

 timerAnimation.stop(); timerAnimation.setCallback(null); timerAnimation.setVisibility(true, false); timerAnimation = null; 

Paso 3 – después de llamar al paso 2 Llamo al paso 1 de nuevo, pero el Sys.out todavía muestra 60 como el número actual de marcos. (El índice inicial aquí se establece en el último cuadro oculto cuando se pulsó el botón de pausa).

Cualquier idea es bienvenida.

Gracias

Tuve el mismo problema donde detener la animación se detendría en el marco actual. Quería que se comportara como iOS, donde parando volvería al primer fotograma. Esta solución funciona para mí:

 ((AnimationDrawable)(someButton.getBackground())).stop(); someButton.setBackgroundDrawable(null); someButton.setBackgroundResource(R.drawable.animation); 

Esto primero lo detiene (probablemente no es necesario). A continuación, se elimina la animación de fondo. Finalmente, recrea el fondo.

Esto enviará el ( timerAnimation AnimationDrawable) a la primera trama tan pronto como stop() haya sido llamado:

 timerAnimation.stop(); timerAnimation.selectDrawable(0); 

Otra posible solución sería tener la misma imagen para el primer fotograma y el último fotograma y hacer lo siguiente en lugar de llamar al método stop ().

 ((AnimationDrawable)(someButton.getBackground())).setOneShot(true); 

Si alguien examina esto más adelante. También hay un método llamado setVisible (boolean visible, boolean restart). Sin embargo, eso no funcionó para mí.

Puede probar public boolean setVisible (boolean visible, boolean restart) y reproducirá la animación una vez. Por ejemplo:

 animationDrawable.setVisible(false, true); 

¿Android.view.animation.Animation.reset () no funciona?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.