2012-03-30 21 views
24

Ok, tengo una actividad en la que tengo múltiples ImageViews y al hacer clic sobre ella, ImageView se desvanecerá y volverá a aparecer. Lo que estoy intentando averiguar es cómo puedo hacer clic en un ImageView e iniciar la animación, y cuando hago clic en un 2nd y la animación sigue ejecutándose, ignorará el segundo. Creo que necesito hacer algo con el animationListener, pero no sé cómo usarlo para verificar si la animación se está ejecutando o no antes de iniciar una nueva animación. Podría haber jurado que vi un ejemplo que hizo esto pero he estado buscando días y no puedo encontrarlo más, espero que alguien pueda ayudar aquí ... a continuación está el código para mi animación:ANDROID: cómo comprobar si la animación se está ejecutando antes de comenzar una nueva animación

// Create Animation 
protected void fadeAnimation() { 
    tempImg.startAnimation(fadeout); 
    //Allow animation to finish 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
     tempImg.startAnimation(fadein); 
     } 
    }, 1000); 
} 

Respuesta

29

Asumo tanto desvanecimiento y FadeIn son Animation objetos.

Utilice fadeout.hasEnded() para verificar si el primero ha terminado antes de iniciar el segundo.

Para más detalles acerca de la clase Animation, ver aquí: http://developer.android.com/reference/android/view/animation/Animation.html

+5

lo que sucede cuando la animación no se ha ejecutado aún, por lo que no devolverá un resultado falso, cancelando la animación. Voy a intentarlo, pero ese es el primer pensamiento que se me vino a la mente. Gracias por la ayuda de cualquier manera. –

+0

Eso lo hizo, solo tuvo que cambiar unas pocas cosas en la sintaxis y funcionó muy bien. Realmente aprecio la ayuda. ¡Gracias un montón! –

+1

@ChrisD Estoy enfrentando el mismo problema. Comprobé usando la función hasEnded() pero el problema es que la primera vez siempre devuelve false. ¿Me puede ayudar? – Kunu

2

En lugar de tener que bucle posiblemente en otro hilo de comprobar si una animación ha terminado, se puede usar un detector de animación, haciendo algo como esto:

// Create Animation 
protected void fadeAnimation() { 
    fadeout.setAnimationListener(new Animation.AnimationListener(){ 
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 
     @Override 
     public void onAnimationEnd(Animation animation) { 
       tempImg.startAnimation(fadein); 
     }    
     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 

    }; 
    tempImg.startAnimation(fadeout); 

} 

con este tipo de solución no tendría que estar comprobando si activa una animación ha terminado y el tiempo con la duración de la animación anterior.

onAnimationEnd (Animación) se activa justo después de que la animación ha finalizado. Esto también resuelve el problema de los usuarios con las opciones de desarrollador "activadas" y la velocidad de animación configurada en "desactivada".

Cuestiones relacionadas