2011-09-30 14 views
74

Ho un'animazione di dissolvenza in una vista (che si trova all'interno di un frammento) e ogni volta che si verifica l'animazione, al termine della visualizzazione la vista si ridisegna nuovamente. Ho trovato un lavoro intorno a fare view.SetVisibility(View.GONE). Ma non aspetta che l'animazione finisca. Vorrei eseguire questo codice setVisibility solo dopo che l'animazione è terminata. Qual è il modo migliore per farlo?End animation event android

+0

Inserisci il codice come si sta mostrando la animazione .... –

risposta

139

È possibile aggiungere animazione ascoltatore al vostro oggetto di animazione come

anim.setAnimationListener(new Animation.AnimationListener(){ 
    @Override 
    public void onAnimationStart(Animation arg0) { 
    }   
    @Override 
    public void onAnimationRepeat(Animation arg0) { 
    }   
    @Override 
    public void onAnimationEnd(Animation arg0) { 
    } 
}); 
+4

Se si desidera impedire l'animazione di fadeout per ricominciare mentre l'animazione è in corso, usare 'if (! anim.hasStarted() || anim.hasEnded())' per rilevare se l'animazione è ancora in esecuzione. – theczechsensation

8

È inoltre possibile raggiungere questo obiettivo usando Animation.setFillAfter

+0

Ho usato questo per risolverlo prima. –

8

Basta prendere l'oggetto animazione e aggiungere animazioni ascoltatore ad esso. Ecco il codice di esempio:

rotateAnimation.setAnimationListener(new AnimationListener() { 

      @Override 
      public void onAnimationStart(Animation animation) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       // TODO Auto-generated method stub 

**// WRITE HERE WHATEVER YOU WANT ON THE COMPLETION OF THE ANIMATION** 


      } 
     }); 
15

Funzionalmente la stessa come la risposta accettata, ma in un modo molto più conciso:

      /* Add/Remove any animation parameter */ 
theView.animate().alpha(0).setDuration(2000).withEndAction(new Runnable() { 
    @Override 
     public void run() { 
      theView.setVisibility(View.GONE); 
     } 
    }); 

Enjoy :)

+1

Clear e one-liner. Risposta top! Può essere semplicemente utilizzato con lambda '.withEndAction (() -> theView.setVisibility (View.GONE));' – theBugger

+0

solo in questo modo con animazioni personalizzate ... grazie bro –

+2

Ricorda che questo è il livello API 16 (4.1) e sopra. – Tommie