我不明白为什么这段代码没有按预期工作。我想取消动画。为了测试它,我打电话给开始动画的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()
并使用两者。
提前致谢
答案 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