2014-09-24 5 views
8

Ich versuche den ViewPropertyAnimator zu verwenden, um eine Ansicht (eine unbestimmte ProgressBar) bei jedem Drücken einer Schaltfläche zu skalieren.Android ViewPropertyAnimator wird nicht gleichzeitig skaliert

loadingCircle.animate().scaleY(1.5f).scaleX(1.5f).setDuration(100f); 

Ich habe eine animatorListener, die wieder normal onAnimationEnd Skalen:

loadingCircle.animate().scaleY(1.0f).scaleX(1.0f).setDuration(100f); 

Nichts zu kompliziert. Es scheint jedoch nicht immer gleichzeitig sowohl x als auch y zu skalieren.

Normalerweise macht es das erste Mal richtig, manchmal das zweite Mal. Wenn es nicht funktioniert, animiert es nur die letzte Operation in der Kette. Wenn es scaleX ist, wird es nur X. skalieren Wenn ich es um tauschen, wird es nur Skala Y.

Dokumentation für scaleX und scaleY sagen:

Animationen bereits auf dem Grundstück laufen wird

abgebrochen werden

Ich dachte jedoch, dass ViewPropertyAnimator verkettet werden konnte, und dieser Kommentar gilt nur für neue Animationen (in einer anderen Codezeile). Mache ich etwas falsch oder habe ich einen Fehler gefunden?

Ich laufe Android 4.2.2 auf einem GalaxyS4. Stock ROM, aber verwurzelt. Wenn das einen Unterschied macht.

+0

Wenn alles, was du beobachtet hast, richtig ist, denke ich, ja, hast du. – mmlooloo

Antwort

6

Ich glaube, das ist in der Tat ein Fehler. Ich arbeitete um dies mit ObjectAnimator anstelle von ViewPropertyAnimator, um das gleiche Ergebnis zu erhalten. Also, würde Ihnen etwas wie folgt aussehen:

ObjectAnimator animX = ObjectAnimator.ofFloat(loadingCircle, "scaleX", 1.0f); 
ObjectAnimator animY = ObjectAnimator.ofFloat(loadingCircle, "scaleY", 1.0f); 
AnimatorSet animSetXY = new AnimatorSet(); 
animSetXY.playTogether(animX, animY); 
animSetXY.start(); 

Quelle: http://developer.android.com/guide/topics/graphics/prop-animation.html#view-prop-animator

2

durch den Quellcode lesen das Verhalten, das Sie macht beschreiben durchaus Sinn und ist konstruktionsbedingt. Wenn Sie eine Animation hinzufügen, wird sie beim nächsten Runloop gestartet. Manchmal sind Sie in der Lage, beide Animationen zu erhalten, bevor dies geschieht, manchmal nicht.

Wenn Sie ihm mitteilen, die Animation nicht sofort zu starten, haben Sie genügend Zeit, alle Ihre Animationen hinzuzufügen. Dies ist offensichtlich ein bisschen wie ein Hack.

Man könnte wahrscheinlich so etwas wie dies versuchen: "Ich habe einen Fehler gefunden"

loadingCircle.animate() 
    .setStartDelay(1000) //prevent the animation from starting 
    .scaleY(1.5f) 
    .scaleX(1.5f) 
    .setDuration(100f) 
    .setStartDelay(0) 
    .start(); 
0
AnimatorSet set = new AnimatorSet(); 
     set.setInterpolator(new AccelerateInterpolator()); 
     set.setDuration(100l); 
     view.setPivotX(halfWidth); 
     view.setPivotY(helfHeight); 
     set.play(ObjectAnimator.ofFloat(view, View.SCALE_X, 0f, 1f)) 
       .with(ObjectAnimator.ofFloat(hRippleAdd, View.SCALE_Y, 0f, 1f)); 
     set.start(); 
+0

ist es besser, etwas über Ihren Code zu erklären;) –