2014-09-24 21 views
8

Sto tentando di utilizzare ViewPropertyAnimator per ridimensionare una vista (una ProgressBar indeterminata) ogni volta che viene premuto un pulsante.Android ViewPropertyAnimator non viene ridimensionato allo stesso tempo

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

Ho un animatorListener in grado di scalare di nuovo al normale onAnimationEnd:

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

Niente di troppo complicato. Tuttavia, non sembra scalare sia xey contemporaneamente allo stesso tempo.

Di solito fa bene la prima volta, a volte la seconda volta. Quando non funziona, anima solo l'ultima operazione della catena. Se è scaleX, si scalerà X. solo se mi scambiarlo in giro, sarà solo scala Y.

documentazione per scaleX e scaleY dire:

animazioni già in esecuzione sulla proprietà verrà annullato

Tuttavia, ho pensato che ViewPropertyAnimator fosse in grado di essere concatenato e questo commento si applica solo alle nuove animazioni (su una diversa riga di codice). Sto facendo qualcosa di sbagliato, o ho trovato un bug?

Sto utilizzando Android 4.2.2 su un GalaxyS4. Stock ROM, ma radicato. Se questo fa la differenza.

+0

se tutto ciò che hai osservato è corretto, io penso di sì. – mmlooloo

risposta

6

Credo che questo sia davvero un bug. Ho lavorato su questo utilizzando ObjectAnimator anziché ViewPropertyAnimator per ottenere lo stesso risultato. Così, il vostro potrebbe essere simile:

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(); 

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

2

Leggendo il codice sorgente del comportamento descritto perfettamente senso ed è di progettazione. Quando aggiungi un'animazione, questa inizierà sul prossimo runloop/quando possibile. A volte sarai in grado di ottenere entrambe le animazioni prima che ciò accada, a volte non lo farai.

Se gli dici di non avviare immediatamente l'animazione, avrai abbastanza tempo per aggiungere tutte le animazioni. Questo ovviamente è un po 'un trucco.

Probabilmente si potrebbe provare qualcosa di simile: "ho trovato un bug"

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

è meglio spiegare un po 'del tuo codice;) –

Problemi correlati