property example animate android android-animation

example - Flicker de animación de Android



property animation android (6)

He estado rastreando tantos hilos en este tema que puedo encontrar en el parpadeo que surge en Android 2.2 cuando trato con los AnimationListeners, pero no puedo resolver mi problema.

Lo que tengo es un ''popover'' de LinearLayout que el usuario toca para bajar unos 100 píxeles y vuelve a tocar para moverlo hacia arriba. Finalmente lo tengo funcionando en la primera parte sin ningún parpadeo (gracias a la sugerencia de llamar a clearAnimation () en la vista que se está animando), pero al hacer lo contrario (es decir, volver a mover la vista), hay un parpadeo en el comienzo. ¡Realmente no puedo llamar a clearAnimation () en el método onAnimationStart () ya que no se anima!

Por supuesto, todas las animaciones funcionan perfectamente si usé setFillAfter () sin ningún oyente de animación, pero luego el área táctil de la vista no se moverá (porque la vista en sí misma 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); } });


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

Tenía muchas animaciones en ejecución, pero el parpadeo comenzó recientemente, pero cuando detecté el problema, se produjo un parpadeo después de dibujar una lista de animaciones en un bucle for . (lista de arreglo)

Simplemente agregué try catch 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 se actualizara un subproceso, por lo que el bucle aún se probó y falló, pero no se mostró, sino que parpadeó, pero al intentarlo y capturarlo en la lista de arreglos, mi problema se resolvió.


Busqué en todas las publicaciones de un problema de animación (flicker y lento). No encontré ninguna respuesta perfecta. Pero he encontrado la solución para la misma, que es la siguiente,

onStart de uso de animación,

view_you_want_to_animate.setDrawingCacheEnabled(true);

onEnd de uso de animación,

view_you_want_to_animate.setDrawingCacheEnabled(false);

Ahora mi vista no tiene un comportamiento fluctuante o lento cuando mi vista está animando. Funciona bien para mi


Me enfrenté al mismo error, pero solo apareció en algunas vistas, aunque todas tenían la misma implementación. Al final resultó que, sucedió por dos razones:

  • Cuando tuve android:animateLayoutChanges="true" en mi elemento xml raíz
  • Cuando la vista problemática estaba directamente conectada al elemento xml raíz

Entonces, dos soluciones: eliminar la android:animateLayoutChanges="true" (sugerido ya que no la estás usando), o usar un diseño de envoltorio alrededor de la vista problemática. Así que en lugar de:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:animateLayoutChanges="true" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/btnClose" android:layout_width="50dp" android:layout_height="50dp"> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_gravity="center" android:src="@drawable/ic_arrow_back" /> </LinearLayout> ... </RelativeLayout>

hacer

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:animateLayoutChanges="true" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="50dp" android:layout_height="50dp"> <LinearLayout android:id="@+id/btnClose" android:layout_width="50dp" android:layout_height="50dp"> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_gravity="center" android:src="@drawable/ic_arrow_back" /> </LinearLayout> </LinearLayout> ... </RelativeLayout>


No debería tener que usar clearAnimation() en onAnimationEnd() .

Prueba esto:

  1. Use setFillBefore(true) y setFillAfter(true) en ambas animaciones
  2. Establezca las propiedades de diseño correctas al iniciar y al finalizar ambas animaciones

Tuve el mismo problema y después de unos 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 clave provino del hecho de que al mostrar la vista, todo funcionó bien. Aparentemente, cuando la animación se está ejecutando, la actualización que se vería forzada por el programa ocurre en segundo plano y no causa el parpadeo. Agregar una breve animación al final de la página onAnimationEnd () cuando estamos ocultando la vista hace que el parpadeo desaparezca.

Aquí está el nuevo 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); }


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

Esto funcionó para mí.