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()