每次按下按钮时,我都会尝试使用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,但根深蒂固。如果这有所不同。
答案 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();