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)
- Android: Añadir un fragmento simple
- OnPreviewframe sólo se llama una vez
- Cómo eliminar el marco del dispositivo en los emuladores de Android Studio
- Cómo hacer la animación de marco suave en Android?
- Videoteca de marco por cuadro
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
- Guardar el primer y el último fotograma de un vídeo como una imagen en Android
- Crear una pantalla de bienvenida animada con marcos en Android
- Animación de cuadros de Android con AnimationDrawable se detiene cuando se usa dentro de TranslateAnimation
- Java marco de desarrollo de escritorio similar a Android?
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?