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


244

我需要停止正在运行的翻译动画。所述.cancel()的方法Animation没有影响; 动画将一直播放到最后。

如何取消正在播放的动画?

Answers:


508

打电话clearAnimation()View你打电话的人startAnimation()


但实际上,我需要做些更复杂的事情:动画停止时,它必须保持在当前位置,即,我有滑动图像,并且在触摸事件中,它必须冻结在该位置。clearAnimation()不是这种情况,因为它会根据setFillAfter()

1
@ user349871:setFillAfter()无论如何,可能不会按照您的想法去做。发生触摸事件时,请清除动画,然后调整布局以影响所需的任何永久更改。
CommonsWare 2010年

好的,我将尝试通过调用clearAnimation()来停止动画。下一步是在停止动画之前找到动画的位置。那是什么API?
混合

@Mix:没有API。
CommonsWare,2010年

7
你好,我们又见面了!我已经找到一种取消动画的方法(根据插值时间)。您需要使Animation成为子类,然后将android代码动画中的代码(例如TranslateAnimation)放在那里。在您的课程中,您将能够保存和跟踪applyTransformation()函数中的位置。
混合

40

在Android 4.4.4上,似乎可以停止View上的Alpha淡入淡出动画的唯一方法是调用View.animate().cancel()(即,调用.cancel()View的ViewPropertyAnimator)。

这是我用于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);

.setListener(null);这帮助了我。
穆罕默德·萨奇布

18

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

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

2
无需致电, v.setAnimation(null);因为它将在中完成 v.clearAnimation();
基督教徒

正如@Christian所说,不需要v.setAnimation(null)
akshay bhange

5

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

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

3

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

这是您应该研究的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];

我们从哪里获得currentTime?
mako

哦,文档说它对应于“壁钟”,在其他地方它们将壁钟定义为System.currentTimeMillis(),它对应于压延时间,并且只要用户或网络更改时间,该壁钟就会跳转。一种奇怪的措施。
mako

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)


0

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

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

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

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

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

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.