2010-07-19 17 views
9

Dove devo avviare uno AnimationDrawable che deve animare quando viene visualizzata l'attività?Avvio di un'animazioneDrawable in Android

La guida dello sviluppatore recommends tramite onWindowFocusChanged, ma questo non viene sempre chiamato quando l'attività fa parte di TabHost.

cito:

E 'importante notare che il metodo start() ha invitato il AnimationDrawable non può essere chiamato durante il metodo onCreate() del vostro attività, perché il AnimationDrawable non è ancora completamente allegato alla finestra. Se si desidera riprodurre l'animazione immediatamente, senza richiedere interazione, allora si potrebbe desiderare di chiamare dal metodo onWindowFocusChanged() nel attività, che verrà chiamato quando Android porta finestra a fuoco.

risposta

6

L'approccio filo parallelo sembra essere il più popolare, ma lo fa alzare 2 grandi temi:

  • Secondo la documentazione, tutto il codice relative interfaccia utente dovrebbe essere eseguito sul principale ("GUI" aka) filo. Mentre chiamare .start() su AnimationDrawable potrebbe non essere considerato una pura operazione di interfaccia utente, sento comunque che dovrebbe seguire quella regola.
  • Non puoi mai sapere esattamente quando inizierà la tua animazione. Ho visto il codice con valori di lunghezza del ritardo "magici" che dovevano risolverlo. Dovresti sapere che Dio uccide un cucciolo ogni volta che un programmatore prende questo approccio.

Quindi, suggerisco di utilizzare il metodo runOnUiThread() molto appropriato. Chiamandolo su onResume() ti assicurerai che il tuo codice di animazione verrà eseguito sul thread principale, che verrà eseguito dopo che la finestra è stata allegata, sapresti dove esattamente il messaggio sta per essere elaborato e nessun gattini dovrà perdere il loro vive:

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

L'attività onResume() viene sempre chiamata quando l'attività viene visualizzata in primo piano. Prova ad avviarlo lì.

+1

Non funziona. Sembra che AnimationDrawable non sia ancora completamente collegato alla finestra. – hpique

7

so che questa domanda è un po 'vecchio, ma questo può essere utile a qualcuno accadendo in tutta questa domanda come ho fatto io. Un modo per avviare AnimationDrawable è creare un nuovo Runnable e utilizzare il metodo post da ImageView.

potete fare come:

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 per risposta di lavoro. La risposta di Vaiden non ha funzionato per me. –

+1

non funziona per me –

0

Secondo la documentazione, è necessario attendere fino a quando la vista è attaccato alla finestra prima di iniziare l'animazione. Pertanto, è necessario aggiungere un OnAttachStateChangeListener alla vista che verrà eseguita quando è stata allegata e avviare l'animazione da lì.

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) { 
    } 
}); 
Problemi correlati