如何停止动画(cancel()无效)

我需要停止一个运行翻译动画。Animation.cancel()方法没有效果;不管怎样,动画会一直播放到最后。

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

160631 次浏览

在你调用startAnimation()View上调用clearAnimation()

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

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

在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);

如果你正在使用动画监听器,设置v.setAnimationListener(null)。对所有选项使用下面的代码。

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

你必须使用.clearAnimation();方法:

runOnUiThread(new Runnable() {
@Override
public void run() {
v.clearAnimation();
}
});
使用方法setAnimation(空)来停止动画,它暴露为in中的公共方法 View.java,它是所有小部件的基类,用于创建交互式UI组件(按钮,文本字段等)。 <代码> / * * *为该视图设置下一个动画。 *如果你想要动画立即播放,请使用 * {@link #startAnimation(android.view.animation.Animation)}代替。 *此方法提供了允许细粒度的 *控制开始时间和无效,但你 *必须确保1)动画有一个开始时间设置,和 * 2)视图的父视图(控制子视图的动画) *将在动画应该失效时失效 *开始。 * * @param animation下一个动画,或null。 * / public void setAnimation(动画动画)

为了停止动画,你可以设置这样的objectAnimator不做任何事情,例如:

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

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

当切换到自动翻转时,就没有动画了

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


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

首先,移除所有与animatior或animator set相关的监听器。然后取消动画器或动画器集。

 inwardAnimationSet.removeAllListeners()
inwardAnimationSet.cancel()

用这种方式:

// 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();

取消()

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


clearAnimation ()

取消此视图的任何动画。


在经历了所有的事情之后,什么都没有起作用。当我在视图中应用多个动画时。 下面是对我有用的代码。

.开始连续淡入和淡出的动画
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()
}

因为没有其他答案提到它,你可以很容易地使用ValueAnimatorcancel()停止动画。

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

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 5f);


int mDuration = 5000; //in millis
valueAnimator.setDuration(mDuration);


valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {


@Override
public void onAnimationUpdate(ValueAnimator animation) {
// Update your view's x or y coordinate
}
});


valueAnimator.start();

然后通过调用停止动画

valueAnimator.cancel()`