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;
}