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.

  • Extraño problema con android: ellipsize = "end"
  • Obtener / recoger una imagen de la aplicación de Android integrada en la Galería mediante programación
  • Android - Predibujar lienzo para onDraw
  • Los elementos de menú no se muestran en SherlockFragmentActivity con pestañas
  • Android - ¿hay una devolución de llamada que se llama justo después onResume ()?
  • Cómo crear este efecto de aplicación de Gmail en Honeycomb
  • SetMinDate (...) para DatePicker no funciona cuando se invoca una segunda vez
  • Balanceo horizontal en stackview
  • Cómo habilitar marcadores de selección para EditText en PopupWindow?
  • Cuándo utilizar res / xml vs.res / carpetas de diseño en Android
  • Diseño del menú emergente en Android 5.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.