2013-04-26 3 views
22

Ho un problema strano con una AlphaAnimation. Si suppone che venga eseguito ripetutamente quando viene chiamato un gestore AsyncTask.Animazione non partire fino a quando gli aggiornamenti dell'interfaccia utente o evento di tocco

Tuttavia, la prima volta che viene chiamato il gestore nello Activity, l'animazione non verrà avviata a meno che non tocchi lo schermo o se l'interfaccia utente venga aggiornata (ad esempio premendo il pulsante del menu del telefono).

La parte strana è che una volta che l'animazione ha percorso almeno una volta, si avvierà senza problemi se il gestore viene chiamato di nuovo.

Ecco ciò che il codice è simile:

// AsyncTask handler 
public void onNetworkEvent() 
{ 
    this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() 
    { 
     flashScreen(Animation.INFINITE); 
    } 
    }); 
} 

// Called method 
private void flashScreen(int repeatCount) 
{ 
    final View flashView = this.findViewById(R.id.mainMenuFlashView); 

    AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); 
    alphaAnimation.setRepeatCount(repeatCount); 
    alphaAnimation.setRepeatMode(Animation.RESTART); 
    alphaAnimation.setDuration(300); 
    alphaAnimation.setInterpolator(new DecelerateInterpolator()); 
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) 
    { 
     flashView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
     flashView.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 
    }); 

    flashView.startAnimation(alphaAnimation); 
} 

ho notato che runOnUIThread non è necessario (stessi risultati si verificano se io non lo uso), ma preferisco tenerlo come io non sono sul thread dell'interfaccia utente.

Tutte le idee su che cosa potrebbe causare questo?

+0

Codice troppo piccolo per capire qual è la sequenza di chiamata. Puoi pubblicare la parte del giro dell'esecuzione di Asynctask? Inoltre, hai provato a registrare la voce su metodi rilevanti per vedere cosa sta succedendo? – ilomambo

+0

Provare a ritardare l'animazione di alcuni secondi per la prima volta. Questo può essere il caso quando stai cercando di eseguire l'animazione prima che la vista sia pronta. –

risposta

39

Un po 'più di ricerca ha dimostrato che il mio problema era lo stesso una tale domanda: Layout animation not working on first run

visibilita 's La flashView è stato impostato su GONE di default (causando il Animation non iniziare immediatamente come il View non era mai stata resi), quindi ho solo bisogno di impostare a INVISIBLE prima di chiamare flashView.startAnimation()

+0

Grazie, rendere INVISIBILE mi ha aiutato. – Vasanth

0

Questo non è un compito facile. Fino ad ottenere una risposta reale: l'avvio dell'animazione viene attivato da onNetworkEvent. Dato che non conosciamo il resto del codice, dovresti cercare lì, provare a cambiare onNetworkEvent con un altro evento che puoi facilmente identificare, solo per eseguire il debug se il resto del codice è ok o se è solo il trigger che è responsabile per questo.

+1

Posso innescare anche in modo semplice e funziona. Il debug mostra che l'animazione di 'AnimationListener' su 'onAnimationStart' non viene chiamata fino a quando non interagisco con l'interfaccia utente la prima volta. – Jukurrpa

+0

@Jukurrpa questo problema si applica a tutte le versioni di Android o alcune versioni specifiche? – Kai

+0

@Kai Ho solo dispositivi 4.1 e 4.2 per provarlo, e lo fa su entrambi. – Jukurrpa

21

Se l'impostazione View-VISIBLE non funziona, come è stato nel mio caso, ha aiutato per me di chiamare requestLayout() prima di iniziare th e Animation, in questo modo:

Animation an = new Animation() { 
... 
view.requestLayout(); 
view.startAnimation(an); 

Nel mio caso, la mia era View0dip alto che ha impedito onAnimationStart da essere chiamato, questo mi ha aiutato intorno a quel problema.

+2

Su alcune versioni di Android anche se non funziona se inizializzare il valore di altezza o larghezza della vista è 0dip. In uno dei miei casi ho dovuto fare il valore iniziale di 1dip e la vista non era visibile a causa del margine. E questo ha aiutato, l'animazione ha funzionato su tutte le versioni. – Oknesif

1

Questo ha funzionato per me:

view.setVisibility(View.VISIBLE); 
view.startAnimation(animation); 

ho dovuto impostare il view-VISIBLE (non INVISIBLE, né GONE), causando la renderization vista necessaria per animarlo.