Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么动画.cancel()和View.clearAnimation()不';我的情况不行吗?_Android_Android Animation_Android View - Fatal编程技术网

Android 为什么动画.cancel()和View.clearAnimation()不';我的情况不行吗?

Android 为什么动画.cancel()和View.clearAnimation()不';我的情况不行吗?,android,android-animation,android-view,Android,Android Animation,Android View,我不明白为什么这个代码不能像预期的那样工作。我想取消一个动画。为了测试它,我调用setLoading(true)谁启动动画并立即设置加载(false)谁取消动画 测试它的代码: setLoading(true); setLoading(false); 代码如下: private void setLoading(boolean loading) { if (loading) { Animation animation = AnimationUtil

我不明白为什么这个代码不能像预期的那样工作。我想取消一个动画。为了测试它,我调用
setLoading(true)谁启动动画并立即
设置加载(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" />
预期结果:

start
cancel

为什么在
动画.cancel()
视图.clearAnimation()
之后调用
onAnimationEnd()

我尝试使用
Animation.cancel()
,使用
View.clearAnimation()
并同时使用这两种方法


提前感谢

它按预期工作,源代码为:

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\u值

那么如何取消动画??或者,如果动画被取消,我可以签入onAnimationEnd()?它可以工作。你能推荐一个更好的方法吗?或者解释为什么取消动画时开始时间不同?谢谢,我想不出更好的方法,但我更新了答案,你可以看到为什么开始时间有那个值
private boolean isCanceled() {
    return mStartTime == Long.MIN_VALUE;
}