2011-09-30 17 views
74

Tengo una animación de fadeout en una vista (que está dentro de un fragmento), y cada vez que ocurre la animación, una vez que termina, la vista se vuelve a dibujar nuevamente. Encontré un trabajo alrededor haciendo view.SetVisibility(View.GONE). Pero no espera a que termine la animación. Me gustaría ejecutar este código de setVisibility solo después de que la animación haya terminado. ¿Cuál es la mejor manera de hacer eso?Evento de animación final android

+0

publicar su código cómo se está mostrando la animación .... –

Respuesta

139

Puede añadir oyente Animación a su objeto de animación como

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

Si desea evitar que la animación de fadeout comience de nuevo mientras la animación está en progreso, use 'if (! anim.hasStarted() || anim.hasEnded())' para detectar si la animación está todavía corriendo. – theczechsensation

8

Simplemente tome su objeto de animación y añadir oyente animación a la misma. Aquí es el código de ejemplo:

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

funcionalmente la misma que la respuesta aceptada, pero de una forma mucho más concisa:

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

Enjoy :)

+1

Transparente y de una sola línea. ¡La mejor respuesta! Puede simplificarse con el uso de lambda '.withEndAction (() -> theView.setVisibility (View.GONE));' – theBugger

+0

solo de esta manera con animaciones personalizadas ... gracias hermano –

+2

Tenga en cuenta que este es el nivel de API 16 (4.1) y superior. – Tommie

Cuestiones relacionadas