检查AnimatorSet是否完成了动画?

25

我正在尝试使用AnimatorSet来实现按钮淡入动画:

按钮淡入 > 单击按钮 > 其余按钮淡出

为了实现这个效果,我想在动画完成后设置onClickListner,但似乎并不起作用。在动画过程中单击按钮会触发onClick事件

setQuestion = new AnimatorSet();           
setQuestion.playSequentially(fadeinAnimationQ,fadeinAnimation1,fadeinAnimation2,fadeinAnimation3,fadeinAnimation4,fadeinAnimation5);
setQuestion.start();

这是检查动画是否已经完成的方法。

private void checkAnimation() {
    while (true) {
        // Check if animation has ended
        if (setQuestion.isRunning() == false) {
            assignListners();
            break;
        }
    }
}

以下是如何添加AnimatorListner的方法:https://dev59.com/kWw05IYBdhLWcg3wYw1s - Zen
3个回答

54

您可以在fadeinAnimation5上设置AnimatorListener,这将为您提供onAnimationEnd回调。

fadeinAnimation5.addListener(new AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {
                // ...
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                // ...
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                // ...
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                // ...
            }
        });

或者,如slott所建议的那样,使用AnimatorListenerAdapter

fadeinAnimation5.addListener(new AnimatorListenerAdapter() {

    @Override
    public void onAnimationEnd(Animator animation) {
        // ...
    }
}

8
如果您不需要所有的事件,可以选择使用AnimatorListenerAdapter,这会让事情变得更加简单。 - slott
2
一个我曾经犯过的错误:onAnimationEnd回调函数在动画完成或被取消时都会被调用。如果只想在动画完成时得到通知,请改用withEndAction(Runnable)。 - Henrik Gyllensvärd

2
我曾经遇到类似的问题,以下是我的解决方法:
private void crossFadeAnimation(final View fadeInTarget, final View fadeOutTarget, long duration){
    AnimatorSet mAnimationSet = new AnimatorSet();
    ObjectAnimator fadeOut = ObjectAnimator.ofFloat(fadeOutTarget, View.ALPHA,  1f, 0f);
    fadeOut.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            fadeOutTarget.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationCancel(Animator animation) {
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
        }
    });
    fadeOut.setInterpolator(new LinearInterpolator());

    ObjectAnimator fadeIn = ObjectAnimator.ofFloat(fadeInTarget, View.ALPHA, 0f, 1f);
    fadeIn.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
            fadeInTarget.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animator animation) {}

        @Override
        public void onAnimationCancel(Animator animation) {}

        @Override
        public void onAnimationRepeat(Animator animation) {}
    });
    fadeIn.setInterpolator(new LinearInterpolator());
    mAnimationSet.setDuration(duration);
    mAnimationSet.playTogether(fadeOut, fadeIn);
    mAnimationSet.start();
}

1
您实际上可以直接为AnimatorSet设置一个监听器,因为AnimatorSet继承自Animator。以下是一些代码:

import android.animation.Animator;

        AnimatorSet setQuestion = new AnimatorSet();
        setQuestion.playSequentially(fadeinAnimationQ,fadeinAnimation1,fadeinAnimation2,fadeinAnimation3,fadeinAnimation4,fadeinAnimation5);
        setQuestion.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {
            // !! turn on your onClickListener here !!
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });
        setQuestion.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接