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

266 人关注

我需要停止一个正在运行的翻译动画。替换代码1】的 .cancel() 方法没有效果;反正动画一直持续到结束。

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

android
animation
Mix
Mix
发布于 2010-11-06
11 个回答
CommonsWare
CommonsWare
发布于 2022-02-16
已采纳
0 人赞同

Call clearAnimation() on whichever View you called startAnimation() .

Mix
但事实上,我需要一个更复杂的东西:当动画停止时,它必须保持在当前位置,也就是说,我有滑动的图像,在触摸事件中,它必须冻结在这个地方。 clearAnimation()不是一个案例,因为它将状态重置到开始/结束位置,取决于setFillAfter()。
@用户349871。替换代码0】可能并不像你想的那样,反正是做了。当触摸事件发生时,清除动画,然后调整你的布局,以影响你所寻求的任何永久性变化。
Mix
好,很好,我将尝试通过调用clearAnimation()来停止动画。 下一步是在我停止动画之前找到动画的位置。这方面的API是什么?
@Mix:没有这方面的API。
Mix
又见面了!我已经找到了一个方法来获取动画被取消的时间点(以插值时间计算)。你需要制作Animation子类,并将android代码动画(例如TranslateAnimation)的代码放在那里。在你的类中,你将能够在applyTransformation()函数中保存和跟踪位置。
Sean Barbeau
Sean Barbeau
发布于 2022-02-16
0 人赞同

在安卓4.4.4系统中,我似乎只能通过调用 View.animate().cancel() 来停止视图上的阿尔法渐变动画(即,在视图的 ViewPropertyAnimator ).

这是我在ICS之前和之后用于兼容的代码。

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

... with the method:

* 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); this helped me.
DjP
DjP
发布于 2022-02-16
0 人赞同

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

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
    
没有必要调用 v.setAnimation(null); ,因为这将在 v.clearAnimation(); 中完成。
正如@Christian所说,v.setAnimation(null)是不需要的。
Aleksandr Gorshkov
Aleksandr Gorshkov
发布于 2022-02-16
0 人赞同

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

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
    
Akos Cz
Akos Cz
发布于 2022-02-16
0 人赞同

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

以下是你应该关注的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];
    
mako
Where do we get currentTime?
mako
哦,文档中说它对应于 "挂钟",在其他地方他们把挂钟定义为System.currentTimeMillis(),它对应于日历时间,只要用户或网络改变时间就会跳转。这是一个奇怪的测量方法。
saurabh dhillon
saurabh dhillon
发布于 2022-02-16
0 人赞同

Use the method setAnimation(null) 来停止一个动画,它作为公共方法暴露在 View.java 的基类,它是所有 widgets 替换代码0】,用于创建交互式UI组件(按钮、文本字段等)。 替换代码0

Andrew Glukhoff
Andrew Glukhoff
发布于 2022-02-16
0 人赞同

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

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

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

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

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
    
Sahil Bansal
Sahil Bansal
发布于 2022-02-16
0 人赞同

首先,移除所有与动画师或动画师集相关的监听器。然后取消这个动画师或动画师集合。

 inwardAnimationSet.removeAllListeners()
        inwardAnimationSet.cancel()
    
Rasoul Miri
Rasoul Miri
发布于 2022-02-16
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();

取消动画。取消一个动画会调用动画 监听器,如果设置了的话,以通知动画的结束。 如果你手动取消一个动画,你必须调用reset() 然后再启动动画。

clearAnimation()

取消该视图的任何动画。

Roshan Kumar
Roshan Kumar
发布于 2022-02-16
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()
    
matdev
matdev
发布于 2022-02-16
0 人赞同

由于其他答案都没有提到,你可以用 ValueAnimator cancel() 轻松地停止一个动画。

替换代码0】在制作动画方面非常强大。下面是一个使用 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