为什么Animation.cancel()和View.clearAnimation()在我的案例中不起作用?

时间:2017-03-16 10:58:35

标签: android android-animation android-view

我不明白为什么这段代码没有按预期工作。我想取消动画。为了测试它,我打电话给开始动画的setLoading(true);,并立即致电取消动画的setLoading(false);

测试代码:

setLoading(true);
setLoading(false);

这里是代码:

    private void setLoading(boolean loading) {
        if (loading) {
            Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
            animation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    Log.i(TAG, "start"); // for debug
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    Log.i(TAG, "end"); // for debug
                    mButton.setVisibility(View.INVISIBLE);
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
            mButton.startAnimation(animation);
            mLoading.setVisibility(View.VISIBLE);
        } else {
            Log.i(TAG, "cancel"); // for debug
            mButton.getAnimation().cancel();
            mButton.setVisibility(View.VISIBLE);
        }
    }

fade_out.xml:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromAlpha="1.0"
    android:startOffset="300"
    android:toAlpha="0.0" />

Logcat:

start
cancel
end

预期结果:

start
cancel

为什么在onAnimationEnd()Animation.cancel()之后调用View.clearAnimation()

我尝试使用Animation.cancel(),使用View.clearAnimation()并使用两者。

提前致谢

1 个答案:

答案 0 :(得分:1)

它正在按预期工作,来自Animatoin源代码:

public void cancel() {
    if (mStarted && !mEnded) {
        fireAnimationEnd();
        mEnded = true;
        guard.close();
    }
    // Make sure we move the animation to the end
    mStartTime = Long.MIN_VALUE;
    mMore = mOneMoreTime = false;
}

private void fireAnimationEnd() {
    if (mListener != null) {
        if (mListenerHandler == null) mListener.onAnimationEnd(this);
        else mListenerHandler.postAtFrontOfQueue(mOnEnd);
    }
}

你可以在onAnimationEnd

中检查是否从这里取消了
animation.getStartTime() == Long.MIN_VALUE

动画实际上有这种方法:

private boolean isCanceled() {
    return mStartTime == Long.MIN_VALUE;
}

但它是私密的。时间不同,因为在cancel()内,您可以看到时间设置为Long.MIN_VALUE