如何停止动画(cancel()不起作用)

时间:2010-11-06 09:37:26

标签: android animation

我需要停止正在运行的翻译动画。 .cancel()的{​​{1}}方法无效;无论如何,动画一直持续到最后。

如何取消正在运行的动画?

9 个答案:

答案 0 :(得分:466)

在您clearAnimation() View的任何startAnimation()上致电{{1}}。

答案 1 :(得分:35)

在Android 4.4.4上,似乎唯一可以阻止视图上的alpha淡化动画的方法是调用View.animate().cancel()(即在视图的ViewPropertyAnimator上调用.cancel())。

以下是我在ICS之前和之后用于兼容性的代码:

public void stopAnimation(View v) {
    v.clearAnimation();
    if (canCancelAnimation()) {
        v.animate().cancel();
    }
}

......用方法:

/**
 * Returns true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 * @return true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 */
public static boolean canCancelAnimation() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}

这是我要停止的动画:

v.setAlpha(0f);
v.setVisibility(View.VISIBLE);
// Animate the content view to 100% opacity, and clear any animation listener set on the view.
v.animate()
    .alpha(1f)
    .setDuration(animationDuration)
    .setListener(null);

答案 2 :(得分:18)

如果您正在使用动画侦听器,请设置v.setAnimationListener(null)。将以下代码与所有选项一起使用。

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);

答案 3 :(得分:4)

你必须使用.clearAnimation(); UI线程中的方法:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                    v.clearAnimation();
            }
        });

答案 4 :(得分:3)

您可以尝试做的是在停止之前从动画中获取变换矩阵并检查Matrix内容以获取您要查找的位置值。

以下是你应该研究的api

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

所以例如(一些伪代码。我没有测试过这个):

Transformation outTransformation = new Transformation();
myAnimation.getTransformation(currentTime, outTransformation);
Matrix transformationMatrix = outTransformation.getMatrix();
float[] matrixValues = new float[9];
transformationMatrix.getValues(matrixValues);
float transX = matrixValues[Matrix.MTRANS_X];
float transY = matrixValues[Matrix.MTRANS_Y];

答案 5 :(得分:0)

使用方法 setAnimation(null)来停止动画,它作为公共方法公开 View.java ,它是所有小部件的基类,用于创建交互式UI组件(按钮,文本字段等)。 /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)

答案 6 :(得分:0)

要停止动画,您可以设置不执行任何操作的objectAnimator,例如

首先,当手动翻转时,动画从左到右:

flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);

然后,当切换到自动翻转时,没有动画

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);

答案 7 :(得分:0)

首先,删除与动画师或动画师集相关的所有侦听器。然后取消动画师或动画师设置。

 inwardAnimationSet.removeAllListeners()
        inwardAnimationSet.cancel()

答案 8 :(得分:0)

使用这种方式:

// start animation
TranslateAnimation anim = new TranslateAnimation( 0, 100 , 0, 100);
anim.setDuration(1000);
anim.setFillAfter( true );
view.startAnimation(anim);

// end animation or cancel that
view.getAnimation().cancel();
view.clearAnimation();

cancel()

取消动画。取消动画会调用动画 监听器,如果设置,通知动画结束。 如果手动取消动画,则必须调用 reset() 在再次开始动画之前。


clearAnimation()

取消此视图的任何动画。