En la entrada anterior vimos cómo convertir un gif animado en una animación para Android. Lo siguiente que queremos hacer es usar esa animación en una aplicación.
Es un problema conocido que si se llama al método AnimationDrawable.start() desde métodos del Activity como en Activity.onCreate(), la animación no se moverá, y solo se verá la primera imagen de la misma. No habrá ningún error, no habrá ningún problema, y sin embargo la animación no se moverá.
La solución la aporta un usuario en la misma hebra del problema, y viene a decir que hay que crear una clase Starter que implemente la interfaz Runnable y crear un objeto de este tipo dentro del método ImageView.post(). De este modo el método run() de la clase Starter se ejecutará en la misma hebra que el método del Activity (la hebra de interfaz del usuario – UI Thread) y además después de que nuestro ImageView haya sido correctamente inicializado y mostrado en pantalla.
Esta primera parte iría en el método del Activity donde queremos asignar e iniciar la animación.
1 2 3 4 5 | // --- %< --- imageView.setBackgroundResource(R.drawable.throbber); AnimationDrawable d = (AnimationDrawable)imageView.getBackground(); imageView.post(new Starter(d)); // --- %< --- |
Y por otro lado tendríamos que crear una clase Starter() como la siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * Starts the animation drawable passed to the constructor. */ class Starter implements Runnable { private AnimationDrawable animationDrawable = null; public Starter(AnimationDrawable animationDrawable) { this.animationDrawable = animationDrawable; } public void run() { this.animationDrawable.start(); } } |
Etiquetas: android, Programación, threads
3 comentarios en “Threads y animaciones en Android”
septiembre 27th, 2011 en 12:02
Gracias por compartir el código. Probé lo de la animación GIF y me funcionó perfectamente,
saludos,
octubre 26th, 2011 en 19:47
¡Gracias!
No sabes las horas que llevo preguntándome por qué mi animación no se movía xD
noviembre 3rd, 2011 en 20:35
¡Me alegro de que os haya servido! :)