it-swarm.com.de

Die Animation beginnt erst, wenn die Benutzeroberfläche aktualisiert wird oder das Ereignis berührt wird

Ich habe ein seltsames Problem mit einer AlphaAnimation. Es soll wiederholt ausgeführt werden, wenn ein AsyncTask-Handler aufgerufen wird.

Beim ersten Aufruf des Handlers in der Variablen Activity wird die Animation jedoch erst gestartet, wenn ich den Bildschirm berührte oder die Benutzeroberfläche aktualisiert wird (z. B. durch Drücken der Menütaste des Telefons).

Das seltsame an der Sache ist, dass die Animation, sobald sie einmal ausgeführt wurde, problemlos startet, wenn der Handler erneut aufgerufen wird.

So sieht der Code aus:

// 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);
}

Ich habe festgestellt, dass runOnUIThread nicht notwendig ist (gleiche Ergebnisse treten auf, wenn ich es nicht verwende), aber ich ziehe es vor, es zu behalten, da ich nicht im UI-Thread bin.

Irgendwelche Ideen, woran das liegen könnte?

26
Jukurrpa

Ein wenig mehr Recherche ergab, dass mein Problem dasselbe war wie diese Frage: Layoutanimation funktionierte beim ersten Durchlauf nicht

Die Sichtbarkeit von flashView war standardmäßig auf GONE eingestellt (wodurch die Animation nicht sofort gestartet wird, da die View nie gerendert wurde). Ich muss sie also vor dem Aufruf von flashView.startAnimation() auf INVISIBLE setzen.

43
Jukurrpa

Wenn die Einstellung der Variable View auf VISIBLE wie in meinem Fall nicht funktioniert, hat es mir geholfen, requestLayout() aufzurufen, bevor Sie die Variable Animation starten.

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

In meinem Fall war meine View0dip hoch, was den Aufruf von onAnimationStart verhinderte. Dies half mir bei diesem Problem.

26
Zebaz

Das hat für mich funktioniert:

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

Ich musste die Variable view auf VISIBLE setzen (nicht INVISIBLE und auch GONE), wodurch die Ansichtsrenderisierung erforderlich war, um sie zu animieren.

2
Mario Velasco

Vielleicht wird es jemandem helfen, weil mir vorherige Antworten nicht geholfen haben.

Meine Animation veränderte die Ansichtshöhe (von 0 auf die tatsächliche Höhe und zurück), wenn Sie die Animationen durch Klicken erweitern und reduzieren.

Nichts funktionierte, bis ich Listener hinzugefügt und die Sichtbarkeit auf GONE festgelegt habe, wenn die Animation endet:

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

        }
    });

Wenn Sie expandieren, setzen Sie es vor der Animation auf VISIBLE:

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

Das ist nicht leicht. Bis Sie eine echte Antwort erhalten haben: Der Animationsstart wird durch onNetworkEvent ausgelöst. Da wir den Rest des Codes nicht kennen, sollten Sie dort nachschauen und versuchen, onNetworkEvent durch ein anderes Ereignis zu ändern, das Sie leicht identifizieren können, nur um zu debuggen, ob der Rest des Codes in Ordnung ist oder ob es sich nur um den Auslöser handelt dafür verantwortlich.

0
TheBeps