La animación no se inicia hasta que las actualizaciones de la interfaz de usuario o el evento de toque

Tengo un problema extraño con una AlphaAnimation . Se supone que se ejecuta repetidamente cuando se llama a un controlador AsyncTask .

Sin embargo, la primera vez que se llama al manejador en la Activity , la animación no se iniciará a menos que toque la pantalla o si la interfaz de usuario se actualiza (pulsando el botón de menú del teléfono, por ejemplo).

La parte extraña es que una vez que la animación se ha ejecutado al menos una vez, se iniciará sin problema si el controlador se llama de nuevo.

A continuación se muestra el aspecto del código:

 // AsyncTask handler public void onNetworkEvent() { this.runOnUiThread(new Runnable() { @Override public void run() { flashScreen(Animation.INFINITE); } }); } // Called method private void flashScreen(int repeatCount) { final View flashView = this.findViewById(R.id.mainMenuFlashView); AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); alphaAnimation.setRepeatCount(repeatCount); alphaAnimation.setRepeatMode(Animation.RESTART); alphaAnimation.setDuration(300); alphaAnimation.setInterpolator(new DecelerateInterpolator()); alphaAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { flashView.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { flashView.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }); flashView.startAnimation(alphaAnimation); } 

He notado que runOnUIThread no es necesario (los mismos resultados ocurren si no lo uso), pero prefiero guardarlo como no estoy en el hilo de UI.

¿Alguna idea sobre qué podría causar esto?

Un poco más de investigación mostró que mi problema era el mismo una pregunta: Animación de diseño no funciona en la primera ejecución

La visibilidad del flashView se estableció en GONE de forma predeterminada (haciendo que la Animation no se inicie inmediatamente, ya que la View nunca se había procesado), por lo que solo necesito configurarla en INVISIBLE antes de llamar a flashView.startAnimation()

Si configurar la View VISIBLE no funcionará, como en mi caso, me ayudó a llamar a requestLayout() antes de iniciar la Animation , así:

 Animation an = new Animation() { ... view.requestLayout(); view.startAnimation(an); 

En mi caso, mi View era 0dip alto que impedía onAnimationStart de ser llamado, esto me ayudó en torno a ese problema.

Esto funcionó para mí:

 view.setVisibility(View.VISIBLE); view.startAnimation(animation); 

Tuve que configurar la view VISIBLE (no INVISIBLE , ni GONE ), causando la visualización de la renderización necesaria para animarla.

Eso no es fácil. Hasta que tengas una respuesta real: El inicio de la animación es activado por onNetworkEvent. Como no sabemos el resto del código, deberías buscarlo, tratar de cambiar onNetworkEvent por otro evento que puedas identificar fácilmente, solo para depurar si el resto del código está bien o si es sólo el gatillo que es Responsable de ello.

  • Carga lenta del diseño
  • ¿Dónde está una referencia al diseño de la interfaz de usuario de Android de XML?
  • Android: calcula el tamaño de la vista dentro de MyAdapter :: getView
  • Sugerencias para el formulario de entrada de datos en android
  • Extraño problema con android: ellipsize = "end"
  • Mostrar AlertDialog en cualquier posición de la pantalla
  • ¿Cómo detectar HTC Sense?
  • Mostrar iconos en el menú de opciones al usar Theme.Holo
  • Barra de estado de superposición en android 4.2.2+
  • ¿Hay una manera más simple / mejor de poner una frontera / contorno alrededor de mi TextView?
  • Android Honeycomb - Cambiar el estilo de la barra de herramientas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.