添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
登录

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

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Peter Mortensen 修改于2017-01-21
  • 该问题已被编辑
  • 提问者: Mix
  • 提问时间: 2010-11-06 17:37

我需要停止正在运行的翻译动画。 Animation .cancel() 方法没有任何效果;动画无论如何都会一直播放到最后。

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

浏览 326 关注 0 得票数 261
  • 得票数为Stack Overflow原文数据
原文
已采纳
回答于2010-11-06
得票数 534

在您调用 startAnimation() 的任何 View 上调用 clearAnimation()

修改于2012-07-03
  • 该回答已被编辑
  • 回答者: Akos Cz
  • 回答时间: 2010-11-10 18:46
得票数 4

您可以尝试做的是在停止动画之前从动画中获取转换矩阵,并检查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];
修改于2017-12-07
  • 该回答已被编辑
  • 回答者: Sean Barbeau
  • 回答时间: 2014-09-30 02:27
得票数 44

在安卓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);
修改于2017-01-21
  • 该回答已被编辑
  • 回答者: DjP
  • 回答时间: 2015-05-28 16:59
得票数 23

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

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
修改于2019-07-15
  • 该回答已被编辑
  • 回答者: Aleksandr Gorshkov
  • 回答时间: 2015-10-21 19:02
得票数 5

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

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
});
回答于2018-08-22
得票数 0

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

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

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

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

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
原文
回答于2021-05-10
得票数 0

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

 inwardAnimationSet.removeAllListeners()
        inwardAnimationSet.cancel()
回答于2022-01-13
得票数 0

在经历了所有的事情之后,什么都没有起作用。因为我在视图中应用了多个动画。下面是为我工作的代码。启动连续淡入和淡出的动画

val mAnimationSet = AnimatorSet()
private fun performFadeAnimation() {
    val fadeOut: ObjectAnimator = ObjectAnimator.ofFloat(clScanPage, "alpha", 1f, 0f)
    fadeOut.duration = 1000
    val fadeIn: ObjectAnimator = ObjectAnimator.ofFloat(clScanPage, "alpha", 0f, 1f)
    fadeIn.duration = 1000
    mAnimationSet.play(fadeIn).after(fadeOut)
    mAnimationSet.addListener(animationListener)
    mAnimationSet.start()
}

不断循环的动画侦听器

 private val animationListener=object : AnimatorListenerAdapter() {
    override fun onAnimationEnd(animation: Animator?) {
        super.onAnimationEnd(animation)
        mAnimationSet.start()
}

停止循环中进行的动画。我做了以下工作。

private fun stopAnimation() {
    mAnimationSet.removeAllListeners()
}
回答于2022-02-16
得票数 0

由于没有其他答案提到这一点,你可以使用 ValueAnimator cancel() 很容易地停止动画。

ValueAnimator 在制作动画方面非常强大。以下是使用 ValueAnimator 创建翻译动画的示例代码

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 5f);
int mDuration = 5000; //in millis
valueAnimator.setDuration(mDuration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   @Override