2012-03-25 11 views
1

Hier ist die Situation. Meine Aktivität läuft und ich rufe eine Funktion auf, um eine Animation zu starten. Sobald diese Animation beendet ist, muss ich noch 2 Sekunden warten und dann den Prozess normal fortsetzen. Was schlägst du vor?Wie wird die Verarbeitung fortgesetzt, nachdem die Animation beendet wurde?

Der OnAnimationEnd hilft meinem Fall nicht bis zum Ende der Iteration, mein Prozess ist bereits von der aufrufenden Funktion zurückgekehrt und hat die Verarbeitung fortgesetzt. Was denkst du, was ich mache? Do thread.sleep (Dauer der Animation + 2 Sek.)? Dank

EDIT: OK Ich dachte, vielleicht sollte ich erklären, was ich in Code mache Ich habe den folgenden Code

Public class myclassActivity extends Activity{ 
.. 
. 
. 
. 
public void runGame(){ 

    player1.startAnimating(); 
    player2.start Animating(); 
    player3.startAnimating(); 
    updateStatus(); 
    runGame(); 
} 

} 

So wie Sie meine Tätigkeit hält für jeden Spieler startAnimating Aufruf sehen. In dem einige Arbeit und dann Animation für 1 Sekunde erledigt ist.

Ich möchte nicht, dass player2.startAnimation beginnt, bis player1.startAnimation abgeschlossen ist und so weiter für den Rest des Codes. Derzeit wird der Code vollständig ausgeführt und erneut ausgeführt, während die Animation noch ausgeführt wird. Bitte irgendwelche Hilfe zu diesem Thema?

+0

Welcher Objekttyp sind player1, player2 und player3? – Phil

+0

Sie sind nur normale Java-Klasse, die nichts erweitert. – Snake

Antwort

0

Verwenden Sie postDelayed Funktion, um etwas nach genauer Verzögerung auszuführen. Zum Beispiel (2 Sekunden Verzögerung):

LinearLayout.postDelayed(new Runnable() { 
    public void run() { 
     //Do something 
    } 
}, 2000); 
+0

Die Sache, es ist nicht etwas schnelles Ich muss laufen. Ich nehme meinen Prozess wieder auf (von der Animation zurückkehrend), also brauche ich die ganze verzögerte – Snake

0

wie etwa Anrufer Instanz vorbei

player1.startAnimating(this) 

und dann Methode aufrufen, wie

myclassActivity#animationFinished(this) 

auf die Fertigstellung Animation von player1/2? dann

void animationFinished(Player p) { 
    if (p==player1) { 
     player2.start(); 
    } else if (p==player2) { 
     player3.start(); 
    } 
} 

oder etwas

+0

Danke für die Antwort. Das würde funktionieren, aber das Problem ist, dass das Code-Design wirklich schlecht wäre, da Sie eine Animationsklasse haben würden, die Methoden außerhalb ihrer erlaubten Kreise aufruft. – Snake

2

diesen Code beobachten es Ihnen helfen, voll ist.

public class PlayersActivity extends Activity { 
ImageView I1,I2; 
Button B; 
Animation T1,T2; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    I1=(ImageView)findViewById(R.id.i1); 
    I2=(ImageView)findViewById(R.id.i2); 

    B=(Button)findViewById(R.id.b1); 

    B.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      T1=new TranslateAnimation(0,100,0,0); 
      T1.setDuration(1000); 
      I1.startAnimation(T1); 
      T1.setAnimationListener(new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        T2=new TranslateAnimation(0,100,0,0); 
        T2.setDuration(1000); 
        T2.setStartOffset(2000); 
        I2.startAnimation(T2); 
        T2.setAnimationListener(new AnimationListener() { 

         @Override 
         public void onAnimationStart(Animation animation) { 
          // TODO Auto-generated method stub 

         } 

         @Override 
         public void onAnimationRepeat(Animation animation) { 
          // TODO Auto-generated method stub 

         } 

         @Override 
         public void onAnimationEnd(Animation animation) { 
          T1.setStartOffset(2000); 
          I1.startAnimation(T1); 

         } 
        }); 

       } 
      }); 


     } 
    }); 

} 

}

Angenommen, Sie werden diese beiden Methoden nach erfolgter Spieler3 beginnen, Sie platzieren Spieler3 onAnimationEnd() {update(); runGame();}

+0

Danke für die Antwort. Das würde funktionieren, aber das Problem ist, dass das Code-Design wirklich schlecht wäre, da Sie eine Animationsklasse haben würden, die Methoden außerhalb ihrer erlaubten Kreise aufruft. – Snake

+0

Ich habe nur einen Beispielcode angegeben, Sie rufen Methoden auf, also definieren Sie onAnimationListener, um Ihren Code in onAnimationEnd() zu implementieren. Sie werden Ihre Methoden dazu aufrufen. – VSC

Verwandte Themen