2017-12-31 129 views
0

ich onClick Methode zugewiesen haben, die w/folgende Struktur mehrere Animationen beginntObjectAnimator Stopp/Abbruch/Neustart Animation auf mehrere Klicks

private static void aniChain (params) 
    final ObjectAnimator step1 = RotateObj(params); 

    final ObjectAnimator step2 = AlphaObj(params); 
    final ObjectAnimator step3 = ScaleXObj(params); 
    final ObjectAnimator step4 = ScaleYObj(params); 

    final ObjectAnimator step5 = ScaleXObj(params); 
    final ObjectAnimator step6 = ScaleYObj(params); 

    final ObjectAnimator step7 = AlphaObj(params); 

    step1.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      super.onAnimationStart(animation); 
      isAnimate = true; //another control option 
      step2.start(); 
      step3.start(); 
      step4.start(); 
     } 
    }); 

    step2.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      step5.start(); 
      step6.start(); 
     } 
    }); 

    step6.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      step7.start(); 
     } 
    }); 

    step7.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      v.setImageDrawable(null); 
      isAnimate = false; // another control option 
     } 
    }); 

    if (!step1.isStarted()) { 
     step1.start(); 
    } 

Grundsätzlich dass Kette am 1. Klick funktioniert gut, aber im 2. oder mehr klicken Sie Bugs aus. Frage ist, wie man sie stoppt?

Ich habe eine andere Bedingungen für die 2. Klick versucht, die

if (!step1.isStarted()) { //if opener is not started then start it 
     step1.start(); 
    } 
    if (step1.isStarted()) { //and if it was started then cancel every 
     step1-7.cancel();  //animation as they are and proceed to end of last animation 
     step7.end(); 
    } 

aber es immer noch Fehler aus sind. Die Deaktivierung friert die Animation hier ein, ähnlich wie beim Pausieren, aber ohne Wiederaufnahme. Es ändert nie Zustand zu Anfang oder irgendjemand anderes, also verstehe ich ziemlich Punkt cancel() nicht. Wie auch immer, nach meiner Logik bei der zweiten Bedingungsprüfung friere ich alle Animationen unabhängig von ihrem Status ein und gehe zum Ende der letzten, um das Bild zu entfernen.

Irgendwie multiple nach mehreren Klicken diese Animationen neigen dazu, miteinander zu Echo, als ob sie voneinander in Methodenaufrufen getrennt sind.

versuchte auch

if (!isAnimate) { 
     step1.start(); 
    } else if (isAnimate) { 
     step1-7.cancel(); 
     step7.end(); 
    } 

nicht funktioniert.

Gibt es eine andere Möglichkeit, isRunning() zu überprüfen und diese Animationen zu stoppen?

upd

hinzugefügt, um diese

if (!isAnimate) { 
     step1.start(); 
     Log.i("boolean","sun "+ isAnimate); 
    } else { 
     isAnimate = false; 
     Log.i("boolean","sun "+ isAnimate); 
    } 

    while (step1.isStarted() && isAnimate) { 
     step1-2.cancel(); 
     step7.end(); 
    } 

aber in diesem Fall Animation beginnt nie. Hinzufügen von while zu if s macht es zum letzten Schritt überspringen, sobald boolean auf true ändert, aber nicht, wenn es einen zweiten Klick gibt. Ich schätze, ich brauche eine Art Hörer statt Schleife.

Antwort

0

Immer wenn Sie aniChain() zum Starten der Animation aufrufen, wird jedes Objekt der Animation, d. H. Schritt 1, Schritt 2 .... immer wieder neu erstellt. Versuchen Sie, sie global zu machen, oder sie sollten mindestens einmal instanziiert werden, damit Sie an denselben Animationsobjekten arbeiten können. Zum Beenden der Animation ist step1.end der richtige Weg, um die Animation des angegebenen Objekts anzuhalten.

+0

Gibt es irgendeine Art von Listener für laufende Animation? Wie onTick für CountdownTImer? Auf diese Weise kann ich mit öffentlichen Boolean sie stoppen. – JayJayAbrams

+0

oder kann ich eine Schleife innerhalb jedes hinzufügen, um nach IsRunning und boolescher Variable zu suchen? also, während es spielt es immer auf einen Wert prüfen und dann, wenn Änderung erscheint Schalter – JayJayAbrams

+0

Sie dachte richtig, mit Boolean Flag wird Ihnen helfen. Nur eine Korrektur, die isAnimate = true in der ersten Zeile der Methode aniChain() und isAnimate = false in onAnimationEnd() von step7 setzt. –

0

Lösung

Added "fake" obj Animator mit kombinierten Dauer aller mit 0 start ‚n zufälligen prop stoppen. Andere Animator-Schritte überschreiben diese Prop-Quelle, während ein falscher Timer bis zum Ende läuft.

stepFake.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      if (!isAnimate) { 
       step7.end(); 
      } 
     } 
    }); 
Verwandte Themen