2010-07-19 9 views
9

¿Dónde debería iniciar un AnimationDrawable que necesita animar cuando se muestra la actividad?Iniciar una animaciónDibujar en Android

La guía del desarrollador recommends utilizando onWindowFocusChanged, pero esto no siempre se llama cuando la actividad es parte de un TabHost.

cito:

Es importante tener en cuenta que el método inicio() llamada en la AnimationDrawable no puede ser llamado durante el método onCreate() de su actividad, debido a que el AnimationDrawable no es pero completamente conectado a la ventana. Si desea reproducir la animación de inmediato, sin necesidad de interacción , entonces es posible que desee llamar a partir del método onWindowFocusChanged() en su actividad, que se llamará cuando Android trae la ventana en foco.

Respuesta

6

El enfoque rosca paralela parece ser el más popular, pero plantea 2 cuestiones principales:

  • De acuerdo con los documentos, todo el código relacionado con la interfaz de usuario debe ejecutarse en el principal ("GUI" aka) hilo. Si bien llamar a .start() en un AnimationDrawable podría no considerarse una operación de UI pura, aún siento que debería seguir esa regla.
  • Nunca se puede saber exactamente cuándo comenzará su animación. He visto código con valores de longitud de retardo "mágicos" que se suponía que arreglarían eso. Debes saber que Dios mata a un gatito bebé cada vez que un programador adopta ese enfoque.

Por lo tanto, sugiero utilizar el muy acertadamente llamado método runOnUiThread(). Llamarlo en Resume() le asegurará que su código de animación se ejecutará en el hilo principal, que se ejecutará después de que se adjunte la ventana, sabrá exactamente dónde está a punto de procesarse el mensaje y ningún gatito debe perder su lives:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      animation.start(); 
     } 
    }); 
} 
0

Siempre se llama a la actividad onResume() cuando la actividad entra en primer plano. Intenta iniciarlo allí.

+1

No funciona. Parece que AnimationDrawable aún no está completamente conectado a la ventana. – hpique

7

Sé que esta pregunta es un poco vieja, pero esto puede ser útil para alguien que está pasando por esta pregunta como yo. Una forma de comenzar con mi AnimationDrawable es creando un nuevo Runnable y usando el método de publicación de ImageView.

usted puede hacer como:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView); 
spinner.setBackgroundResource(R.drawable.spinner); 
spinner.post(new Runnable() { 
    public void run() { 
     AnimationDrawable anim = (AnimationDrawable) spinner.getBackground(); 
     anim.start(); 
    } 
}); 
+0

+1 para respuesta de trabajo. La respuesta de Vaiden no funcionó para mí. –

+1

no funciona para mí –

0

Según la documentación, debe esperar hasta que la vista se fija a la ventana antes de iniciar la animación. Por lo tanto, debe agregar un OnAttachStateChangeListener a la vista que se ejecutará cuando se haya adjuntado, y comenzar la animación desde allí.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 
Cuestiones relacionadas