2016-05-01 9 views
0

Ich habe eine Aktivität mit einer Symbolleiste (die Teil der SharedElements Aktivität Eingabe Animation ist) und unter dieser Symbolleiste sind drei ImageViews horizontal nebeneinander. In ihrer XML-Implementierung sind alle drei INVISIBLE gesetzt.ImageViews Flackern, bevor sie sichtbar sein sollten

Was ich versuche zu tun ist, sie zu animieren, sequenziell hinter der Symbolleiste zu "fallen". Mein Implemenation ist dies:

int delay = 500; 
    for (int y = 0; y < 3; y++) { 

     ObjectAnimator oa = ObjectAnimator.ofFloat(imageViews[y], 
       "translationY", -300, 0); 
     oa.setDuration(600); 
     oa.setStartDelay(delay); 
     oa.start(); 
     imageViews[y].setVisibility(View.VISIBLE); 
     delay = delay+100; 
    } 
} 

Wie Sie sehen, ich bin Iterieren durch die drei ImageViews und eine Animation starten für jedes von einem -300 X-Position zu gehen (was hinter der Symbolleiste), um ihre normale Position. Diese Animation funktioniert super - so wie ich es möchte, aber das Problem ist, dass kurz bevor alle ImageViews kurz flackern, was ich nicht erklären kann. Ich habe das Debuggen versucht, aber während ich durch die Zeilen dieses Teils gehe, bleibt mein Bildschirm schwarz. Ich kann also nicht feststellen, wo/warum die Views sichtbar werden.

Vielleicht können Sie mir helfen, meinen Fehler zu finden.

Here's a gif of the srtange behaviour.


Danke, das ist mein Arbeits Code:

Für alle drei ImageViews:

ObjectAnimator anim1Pin = ObjectAnimator.ofFloat(img_pinned, "translationY", -300, 0); 
    anim1Pin.setDuration(ANIMATON_DURATION); 
    anim1Pin.setStartDelay(300); 
    anim1Pin.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      img_pinned.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 

     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 
    }); 

Und die AnimatorSet:

AnimatorSet animatorSet = new AnimatorSet(); 
    animatorSet.playTogether(anim1Pin, anim2Alarm, anim3LED); 
    animatorSet.start(); 

Antwort

1

Wenige Dinge, zuerst kann das Problem so einfach sein, wie den visibility Zustand auf GONE zu setzen und dann nach dem Start der Animation sichtbar zu machen. Allerdings würde ich auch AnimatorSet verwenden, um die Animationen zusammen zu spielen und die Verzögerung hinzuzufügen, anstatt es in einer Schleife zu tun. Wenn Sie AnimatorSet verwenden, gibt es eine onAnimationStart Methode in AnimationListener, die Sie verwenden können, um die sichtbare zu VISIBLE setzen, anstatt es zu tun, wie Sie sicherstellen müssen, dass sie zur richtigen Zeit sichtbar werden.

+0

Danke, es funktioniert und ich habe meinen Eröffnungsbeitrag aktualisiert. Aber dein GONE-Vorschlag war nicht optimal, weil die Gravitation der GridView, in der die ImageViews sind, horizontal zentriert ist, so dass die Icons nur von der Mitte herunterkamen, um ihre Position zu verschieben, wenn das nächste Bild sichtbar wurde. Unsichtbar ist die bessere Wahl über Gone – Eyntschl

+0

Froh, dass ich helfen konnte, hatte nicht viel von dem ursprünglichen Beitrag zu gehen, aber ich bin froh, dass mein Vorschlag geholfen hat. – Ali