正如Writing Custom View for Android所说:
删除onDetachedFromWindow中发布的所有Runnable
我有自定义视图CircleCheckBox
。当点击动画时将会执行。
动画由View#postInvalidate()
实现。
那么有没有办法删除onDetachedFromWindow()
中任何已发布的runnable?
让我告诉你CircleCheckBox
的工作原理。
在CircleCheckBox
构造函数中,我为它设置了View#OnClickListener
:
this.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggle();
if (mListener != null) {
mListener.onCheckedChanged(isChecked());
}
}
});
在方法toggle()
中,它将调用:
@Override
public void setChecked(boolean checked) {
....
if (checked) {
startCheckedAnimation();
} else {
startUnCheckedAnimation();
}
}
我们说startCheckedAnimation()
。
private void startCheckedAnimation() {
// circle animation
ValueAnimator circleAnimator = ValueAnimator.ofFloat(0f, 1f);
circleAnimator.setInterpolator(new DecelerateInterpolator());
circleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
mArcPath.reset();
mArcPath.addArc(mRectF, -159, 360 * (1 - value));
postInvalidate();
}
});
circleAnimator.setDuration(mDuration / 4);
circleAnimator.start();
}
我使用postInvalidate()
方法让视图调用onDraw()
。
答案 0 :(得分:0)
View#clearAnimation()
将取消已应用于View
的所有动画。
在您的情况下,您使用的是ValueAnimator
,这意味着您必须保留对它的引用,当您需要取消动画时,您应该执行ValueAnimator#cancel()
:
private ValueAnimator circleAnimator;
...
circleAnimator = ValueAnimator.ofFloat(0f, 1f);
// setup and start `ValueAnimator`
然后,当需要取消动画时:
circleAnimator.cancel();
答案 1 :(得分:-1)