2014-09-24 48 views
8

我想在每次按下按鈕時使用ViewPropertyAnimator來縮放視圖(不確定的ProgressBar)。Android ViewPropertyAnimator不能同時縮放

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

我有鱗恢復正常onAnimationEnd的animatorListener:

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

沒有什麼太複雜。但是,它似乎並不總是在同一時間擴展x和y。

通常它第一次是正確的,有時是第二次。 當它不起作用時,它只會動畫鏈中的最後一個操作。如果它的scaleX,只會擴大X.如果我身邊掉它,它就會爲的scaleX和scaleY只有規模Y.

文檔說:

動畫已經對房地產運行將被取消

但是,我認爲ViewPropertyAnimator能夠被鏈接,並且此評論僅適用於新的動畫(在不同的代碼行上)。我做錯了什麼,或者我發現了一個錯誤?

我在GalaxyS4上運行Android 4.2.2。股票ROM,但紮根。如果這有所作爲。

+0

如果你觀察到的都是正確的,我想是的,你有。 – mmlooloo 2014-12-16 13:38:04

回答

6

我相信這確實是一個錯誤。我通過使用ObjectAnimator而不是ViewPropertyAnimator來解決此問題,以獲得相同的結果。所以,你會看起來像:

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

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

2

通過源代碼,您所描述的行爲是非常合情合理的,是由設計閱讀。當你添加一個動畫時,它會在下一個runloop開始/當它可以。有時候,在這種情況發生之前,你可以同時獲得兩個動畫,有時你不會。

如果您告訴它不要立即開始動畫,那麼您將有足夠的時間添加所有動畫。這顯然有點破綻。

你也許可以嘗試這樣的事情: 「我已發現了一個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

它更好地解釋一下你的代碼;) – 2015-11-09 08:38:34