2010-11-06 8 views
5

Tengo un problema común al hacer la animación en Android. Quería comenzar una animación cuando comienza la actividad, en el método onCreate(), pero como mucha gente ha encontrado, no funciona.AnimaciónDibujo en el problema de Android

He leído muchos consejos pero nada parece funcionar para mí. Si comienzo la animación en onClick() funciona, requiere la entrada del usuario, no se inicia de inmediato.

Intenté iniciarlo en una hebra separada en onCreate() pero eso tampoco funciona. Leí aquí:

http://code.google.com/p/android/issues/detail?id=1818

pero ninguno de los consejos trabajado, o que no podía entenderlo.

¿Alguien puede ayudar?

Respuesta

0

Según el enlace que proporcionó, debe iniciar la animación en un hilo separado. En Java se hace eso implementando la interfaz Runnable y empezar con

Thread t = new Thread(new MyRunnable()); // MyRunnable inherits Runnable 
t.start(); 

también se puede escribir el código como este

new Thread(new Runnable() { 
    public void run(){ 
     // some code that runs outside the ui thread. 
    } 
}).start(); 

si no se desea implementar una clase completamente nueva. Este último por supuesto no es tan bonito, pero si estás haciendo un pequeño proyecto, puede ser bueno saberlo.

¿Lo ha intentado de esta manera o ha comenzado su hilo de otra manera?

Lea también Painless Threading que explica las posibilidades que tiene para realizar acciones fuera del subproceso ui y cómo publicar métodos que se ejecutan en el subproceso ui de sus propios subprocesos.


Editar: Después de revisar el enlace publicado usted tiene que esperar un tiempo antes de comenzar su hilo, probablemente hasta onCreate es completa. De acuerdo con the flowchart on this page, debería poder comenzar su animación más tarde, por ejemplo, en la llamada onResume. ¿Has intentado iniciarlo en un método llamado después de onCreate?

Sólo debe crear cosas en onCreate, y "comenzar" en onStart o onResume.

3

me he enfrentado a problemas similares, y cambió a anulando onWindowFocusChanged() en lugar de onCreate() y onResume():

public void onWindowFocusChanged(boolean hasFocus) 
{ 
    if (hasFocus) 
    { 
     animation.start(); 
    } 
    else 
    { 
     animation.stop(); 
    } 
} 
+0

Esto funciona, pero supongo que no dará la mayoría de la gente el control suficiente para hacer lo que quieran; por ejemplo, para comenzar una animación antes de comenzar una tarea y detenerla después. –

+0

esto funciona, pero encontré que si llamo 'animation.start()' antes 'onWindowFocusChanged (true)' y luego de nuevo llamamos 'animation.start() 'from within' onWindowFocusChanged (true) '¡entonces la animación no se iniciará! Entonces, lo que tuve que hacer es seguir el estado de UI. Así que dentro de 'if (hasFocus)' de Vaiden, establecí una variable miembro 'isVisible = true;' y todas las posteriores 'animation.start()' primero comprueban 'isVisible == true'. Es un PITA * major * cuando se inicia automáticamente varias animaciones. –

1

Yo creo que hay que iniciar la animación después de la inicialización de la opinión de que se trate Esta completo. Usted debe ser capaz de hacer algo como esto:

final ImageView tweenImage = (ImageView) findViewById(R.id.imageView1); 
tweenImage.setBackgroundResource(R.anim.cubicfacetween);  
tweenImage.post(new Runnable() { 
    @Override 
    public void run() { 
     AnimationDrawable frameAnimation = 
      (AnimationDrawable) tweenImage.getBackground(); 
     frameAnimation.start(); 
    } 
} 

Para ajustar src en imageView

((ImageView)findViewById(R.id.no_network_icon)).post(new Runnable() { 
      @Override 
      public void run() { 
       AnimationDrawable drawable = (AnimationDrawable) ((ImageView)findViewById(R.id.no_network_icon)).getDrawable(); 
       drawable.start(); 
      } 
     }); 
+0

Esto funcionó en un Nexus 4, Nexus 5, y el viejo Sony Erricson corriendo 2.3 Pero no funcionó en un HTC One V corriendo 4.03 ... ¿Alguna idea? La vista que está animada simplemente no dibuja ... Si reemplazo la animación con un color, la vista aparece bien. – Stephen

+0

publique el fragmento de código. –

+0

problema resuelto al diferenciar entre la configuración de Animation.xml en la propiedad background o en la propiedad src de ImageView. –