Android ViewPropertyAnimator不能同时缩放

我试图使用ViewPropertyAnimator每次按下button时缩放视图(不确定的ProgressBar)。

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

我有一个animatorListener,缩放回正常onAnimationEnd:

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

没有太复杂。 但是,似乎并不总是在同一时间同时调整x和y。

通常第一次是正确的,有时是第二次。 当它不起作用时,它只会animation链中的最后一个操作。 如果是scaleX,它只会缩放X.如果我交换它,它只会缩放Y.

scaleX和scaleY的文档说:

已经在该物业上运行的animation将被取消

不过,我认为ViewPropertyAnimator能够被链接,而这个评论只适用于新的animation(在不同的代码行上)。 我做错了什么,或者我发现了一个错误?

我在GalaxyS4上运行Android 4.2.2。 股票ROM,但扎根。 如果这有所作为

Solutions Collecting From Web of "Android ViewPropertyAnimator不能同时缩放"

我相信这确实是一个错误。 我通过使用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

通过源代码阅读你所描述的行为是非常有意义的,是通过devise。 当你添加一个animation的时候,它会从下一个runloop开始。 有时候在这种情况发生之前,你可以同时获得两个animation,有时你不会。

如果你告诉它不立即开始animation,那么你将有足够的时间来添加所有的animation。 这显然是一个黑客。

你可以尝试这样的事情:

 loadingCircle.animate() .setStartDelay(1000) //prevent the animation from starting .scaleY(1.5f) .scaleX(1.5f) .setDuration(100f) .setStartDelay(0) .start(); 
 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();