2010-07-19 13 views
9

Wo soll ich eine AnimationDrawable starten, die animiert werden muss, wenn die Aktivität angezeigt wird?Starten einer AnimationDrawable in Android

Die Entwickleranleitung recommends mit onWindowFocusChanged, aber dies wird nicht immer aufgerufen, wenn die Aktivität Teil einer TabHost ist.

Ich zitiere:

Es ist wichtig zu beachten, dass die start() -Methode auf dem AnimationDrawable genannt nicht während der onCreate() -Methode Ihrer Aktivität aufgerufen werden, da die AnimationDrawable nicht ist noch vollständig am Fenster befestigt. Wenn Sie wollen sofort die Animation spielen, ohne Interaktion erfordert, dann Sie es von der onWindowFocusChanged() -Methode in Ihrem Aktivität aufrufen möchten, die aufgerufen wird erhalten, wenn Android Fenster in den Fokus bringt.

Antwort

6

Der parallele Thread Ansatz scheint die beliebteste zu sein, aber es hat zwei wichtige Fragen stellen:

  • Nach der Dokumentation, die all UI-bezogenen Code auf der Haupt ausgeführt werden soll (auch bekannt als „GUI“) Faden. Obwohl das Aufrufen von .start() in einem AnimationDrawable möglicherweise nicht als reine UI-Operation betrachtet wird, sollte diese Regel trotzdem eingehalten werden.
  • Sie können nie genau wissen, wann Ihre Animation beginnt. Ich habe Code mit "magischen" Verzögerungslängenwerten gesehen, die das beheben sollten. Du solltest wissen, dass Gott jedes Mal ein Babykätzchen tötet, wenn ein Programmierer diesen Ansatz wählt.

Also, ich schlage vor, die sehr treffend benannte runOnUiThread() -Methode zu verwenden. Durch den Aufruf von onResume() können Sie sicherstellen, dass Ihr Animationscode auf dem Hauptthread ausgeführt wird, dass er ausgeführt wird, nachdem das Fenster angefügt wurde. Sie würden wissen, wo genau die Nachricht verarbeitet werden soll und keine Kätzchen verlieren müssen Leben:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      animation.start(); 
     } 
    }); 
} 
0

Die Aktivität onResume() wird immer aufgerufen, wenn die Aktivität in den Vordergrund tritt. Versuchen Sie es dort zu starten.

+1

Funktioniert nicht. Es scheint, dass das AnimationDrawable noch nicht vollständig an das Fenster angehängt ist. – hpique

7

Ich weiß, dass diese Frage ein bisschen alt ist, aber das kann hilfreich sein, dass jemand über diese Frage passiert, wie ich es getan habe. Eine Möglichkeit, meine AnimationDrawable zu starten, besteht darin, ein neues Runnable zu erstellen und die post-Methode aus ImageView zu verwenden.

Sie können wie tun:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView); 
spinner.setBackgroundResource(R.drawable.spinner); 
spinner.post(new Runnable() { 
    public void run() { 
     AnimationDrawable anim = (AnimationDrawable) spinner.getBackground(); 
     anim.start(); 
    } 
}); 
+0

+1 für die funktionierende Antwort. Vaiden's Antwort funktionierte nicht für mich. –

+1

funktioniert nicht für mich –

0

Gemäß der Dokumentation, Sie, bis die Ansicht vor dem Start Animation an das Fenster angebracht ist, muss warten. Daher sollten Sie der Ansicht, die beim Anschließen ausgeführt wird, eine OnAttachStateChangeListener hinzufügen und die Animation von dort aus starten.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 
Verwandte Themen