如何停止动画(来自ObjectAnimator)

时间:2015-12-09 18:09:45

标签: android android-animation

以下是属于我的活动的代码,其中我有一个按钮(someButton),当点击该按钮时,在另一个视图上启动动画,更具体地说,就是同一活动的进度条视图:

// [...]
someButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        ObjectAnimator animation = ObjectAnimator.ofInt(progressView, "progress", 0, 2000);
        animation.setDuration(2000);
        animation.setInterpolator(new DecelerateInterpolator());
        animation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                // some code to execute when the animation ends
            }
        });
        animation.start();
    }
});
// [...]

现在,在某些时候我可能需要停止进度条视图的动画(例如,当用户点击停止按钮时)。我打电话给progressView.clearAnimation()来停止动画,但没有成功。我还注意到progressView.getAnimation()返回null ... 当我将ObjectAnimator animation变量设置为最终并将其移到someButton.setOnClickListener之外,以便我可以在以后访问它以停止动画时,当我点击someButton时我得到以下异常(就像发生的事情一样{ {3}}):

java.lang.NullPointerException
   at android.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:505)
   at android.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:487)
   at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:517)
   at android.animation.ValueAnimator.start(ValueAnimator.java:936)
   at android.animation.ValueAnimator.start(ValueAnimator.java:946)
   at android.animation.ObjectAnimator.start(ObjectAnimator.java:465)
   at android.animation.AnimatorSet$1.onAnimationEnd(AnimatorSet.java:579)
   at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
   at android.animation.ValueAnimator.access$400(ValueAnimator.java:50)
[...]

抛出该异常的代码是:

// [...]

final ObjectAnimator animation = ObjectAnimator.ofInt(progressView, "progress", 0, 2000);
animation.setDuration(2000);
animation.setInterpolator(new DecelerateInterpolator());
animation.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // some code to execute when the animation ends
    }
});

someButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        animation.start();// NPE occurs here!
    }
});
// [...]

这里有什么问题?怎么能停止那个动画???

4 个答案:

答案 0 :(得分:0)

首先,您可以查看this link以获取更好的示例。

我还建议你不要停止动画(除非你用扩展视图正确实现它,使用postDelay和线程休眠的处理程序。 如果完成某些逻辑,只需删除视图/打开另一个屏幕,特别是如果它是progressView,它不需要显示但不能旋转,只需删除它的可见性。

祝你好运

答案 1 :(得分:0)

尝试: animation.setCurrentPlayTime(0);

答案 2 :(得分:0)

尝试

anim.cancel();
anim.end();
anim.removeAllListeners();

答案 3 :(得分:0)

您可以使用这种方式:

valueAnimator?.removeAllUpdateListeners()
valueAnimator?.removeAllListeners()
valueAnimator?.end()
valueAnimator?.cancel()
valueAnimator = null