2012-02-22 11 views
16

He estado rastreando la mayor cantidad de temas sobre este tema que puedo encontrar en el parpadeo que aparece en Android 2.2 cuando trato con AnimationListeners, pero no puedo resolver mi problema.Android Animation Flicker

Lo que tengo es un "popover" LinearLayout que el usuario toca para bajar unos 100 píxeles, y toca de nuevo para volver a subirlo. Finalmente lo tengo trabajando en la primera parte sin ningún parpadeo (gracias a la sugerencia de llamar a clearAnimation() en la vista que se anima), pero al hacer lo contrario (es decir, mover la vista hacia atrás), hay un parpadeo en el comienzo. Realmente no puedo llamar a clearAnimation() en el método onAnimationStart() ya que no se animará.

Por supuesto, todas las animaciones funcionan perfectamente si utilicé setFillAfter() sin ningún oyente de animación, pero el área táctil de la vista no se moverá (porque la vista en sí no se ha movido).

Cualquier ayuda sería muy apreciada.

this.popoverTab.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     popoverTab.setClickable(false); 
     popoverTab.setFocusable(false); 
     if (popoverHidden) { 
      Log.d(TAG, "About to show popover"); 
      // the popover is currently hidden, show it. 
      TranslateAnimation animation = new TranslateAnimation(0, 0, 100, 0); 
      animation.setDuration(700); 
      animation.setFillBefore(true); 
      animation.setAnimationListener(new AnimationListener() { 
       public void onAnimationEnd(Animation animation) { 

       } 

       public void onAnimationRepeat(Animation animation) { 

       } 

       public void onAnimationStart(Animation animation) { 
        footer.layout(footer.getLeft(), (footer.getTop() - 100), footer.getRight(), footer.getBottom()); 
       } 
      }); 
      footer.startAnimation(animation); 
     } else { 
      Log.d(TAG, "About to hide popover"); 
      // the popover is showing, hide it. 
      TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100); 
      animation.setDuration(700); 
      animation.setFillAfter(true); 
      animation.setAnimationListener(new AnimationListener() { 
       public void onAnimationEnd(Animation animation) { 
        footer.clearAnimation(); 
        footer.layout(footer.getLeft(), (footer.getTop() + 100), footer.getRight(), footer.getBottom()); 
       } 

       public void onAnimationRepeat(Animation animation) { 

       } 

       public void onAnimationStart(Animation animation) { 

       } 
      }); 
      footer.startAnimation(animation); 
     } 
     // invert. 
     popoverHidden = !popoverHidden; 
     popoverTab.setClickable(true); 
     popoverTab.setFocusable(true); 
    } 

}); 

Respuesta

50

que tenía el mismo problema y después de algunos días encontré la solución ... gracias a:

http://www.mail-archive.com/[email protected]/msg67535.html

me di cuenta de una solución a este problema. La pista vino del hecho que al mostrar la vista, todo funcionó bien. Aparentemente, cuando la animación se está ejecutando, la actualización que sería forzada por el programa ocurre en segundo plano y no causa el parpadeo . Agregar una animación corta al final del en AnimationEnd() cuando estamos ocultando la vista hace que el parpadeo vaya de distancia.

Aquí está la nueva onAndimationEnd() en el código de trabajo

public void onAnimationEnd(Animation animation) { 
      animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f); 
      animation.setDuration(1); 
      mPlayer0Panel.startAnimation(animation); 
    } 
+0

Esto debe marcarse como la respuesta. +1 –

+0

¡Muchas gracias por resolver este problema! –

+1

Muchas gracias. Me llevó demasiado tiempo para encontrar esto. – braden

3

Usted no debería tener que utilizar clearAnimation() en onAnimationEnd().

Prueba esto:

  1. Uso setFillBefore(true) y setFillAfter(true) en ambos animaciones
  2. Establecer las propiedades de diseño correctas cuando se inicia y cuando termina ambos animaciones
+0

Todavía terminé con un parpadeo al mover el panel hacia atrás. Solucioné el problema colocando una vista falsa que contenía el mismo contenido que el que estaba delante de él. – JRod

+0

Tengo el mismo problema, parece que el ajuste de view.layout() causa el parpadeo. – Jeroen

0

Alrite, que tenía el mismo problema que me hizo buscarlo, que terminó en este post. Encontré una solución para mi problema, pensé en compartir mi solución.

Tenía muchas animaciones ejecutándose pero el parpadeo comenzó recientemente, pero cuando rastreé el problema encontré el parpadeo producido después de dibujar la lista de animaciones bajo un para el lazo. (lista de matriz)

Simplemente agregué try catch para evitar el problema después de localizarlo, el problema; algunas de las animaciones se eliminaron al vuelo, pero no hubo tiempo suficiente para que un hilo se actualizase, por lo que el ciclo aún lo intentó y falló, pero no se mostró parpadeando, pero en el intento y en el dibujo de la lista de arreglo se solucionó mi problema.

2

He buscado todas las publicaciones de stackoverflow para el problema de animación (parpadeo y lentitud). No encontré ninguna respuesta perfecta. Pero he encontrado la solución para el mismo, que es como abajo,

onStart de uso Animación,

view_you_want_to_animate.setDrawingCacheEnabled(true); 

OnEnd de uso Animación,

view_you_want_to_animate.setDrawingCacheEnabled(false); 

Ahora mi punto de vista no disponga de parpadeo o comportamiento lento cuando mi vista está animando. Funciona bien para mí.

+0

Esto funcionó para mí ... ¡Gracias! –

+0

Esto también funcionó para mí, tanto con una animación alfa independiente como con un conjunto de animación de escala de traducción +. – BVB

11
@Override 
public void onAnimationEnd(Animation animation) 
{ 
    footer.clearAnimation(); 
} 

Esto funcionó para mí.

+1

Muchas gracias ... – Sayka