studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-animation android-ui

android - programacion - La animación no comienza hasta que se actualiza UI o un evento táctil



manual de programacion android pdf (5)

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

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

Lo extraño es que una vez que la animación se haya ejecutado al menos una vez, se iniciará sin problemas si se vuelve a llamar al controlador.

Así es como se ve el 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); }

Me he dado cuenta de que runOnUIThread no es necesario (se producen los mismos resultados si no lo uso), pero prefiero mantenerlo porque no estoy en el hilo de la interfaz de usuario.

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


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, debe buscar allí, intentar cambiar en NetworkEvent por otro evento que pueda identificar fácilmente, solo para depurar si el resto del código está bien o si solo es el disparador. responsable de ello


Esto funcionó para mí:

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

Tuve que establecer la view en VISIBLE (no INVISIBLE , ni GONE ), lo que provocó que la renderización de la vista fuera necesaria para animarla.


Puede ser que ayude a alguien, porque las respuestas anteriores no me ayudaron.

Mi animación cambiaba la altura de la vista (de 0 a su altura real y atrás) al hacer clic: expandir y contraer animaciones.

Nada funcionó hasta que agregué la escucha y configuré la visibilidad en GONE, cuando la animación termina:

collapseAnim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { view.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } });

Y cuando expanda, simplemente configúrelo en VISIBLE antes de la animación:

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


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

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

En mi caso, mi View fue 0dip alta, lo que evitó que se onAnimationStart , lo que me ayudó a solucionar ese problema.


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

La visibilidad de flashView se estableció en GONE de forma predeterminada (lo que provocó que la Animation no se iniciara inmediatamente, ya que la View nunca se había renderizado), así que solo necesito configurarlo en INVISIBLE antes de llamar a flashView.startAnimation()