Android ViewPropertyAnimator不会同时缩放

时间:2014-09-24 19:05:57

标签: android animation view scale

每次按下按钮时,我都会尝试使用ViewPropertyAnimator缩放视图(不确定的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。

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

scaleX和scaleY的文档说:

  

已经在该属性上运行的动画将被取消

但是,我认为ViewPropertyAnimator能够被链接,并且此注释仅适用于新动画(在不同的代码行上)。我做错了什么,或者我发现了一个错误?

我在GalaxyS4上运行Android 4.2.2。股票ROM,但根深蒂固。如果这有所不同。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

通过源代码阅读您描述的行为非常有意义且符合设计。添加动画时,它将在下一个runloop /可能的时候开始。有时你可以在这之前获得两个动画,有时你不会。

如果您告诉它不立即启动动画,那么您将有足够的时间添加所有动画。这显然有点像黑客。

你可能会尝试这样的事情:

loadingCircle.animate()
    .setStartDelay(1000) //prevent the animation from starting
    .scaleY(1.5f)
    .scaleX(1.5f)
    .setDuration(100f)
    .setStartDelay(0)
    .start();

答案 2 :(得分: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();