自定义视图删除所有postInvalidate()

时间:2017-05-17 03:47:27

标签: android android-animation android-custom-view

正如Writing Custom View for Android所说:

  

删除onDetachedFromWindow中发布的所有Runnable

我有自定义视图CircleCheckBox。当点击动画时将会执行。

动画由View#postInvalidate()实现。

那么有没有办法删除onDetachedFromWindow() 中任何已发布的runnable?

修改

让我告诉你CircleCheckBox的工作原理。

第1步

CircleCheckBox构造函数中,我为它设置了View#OnClickListener

this.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        toggle();
        if (mListener != null) {
            mListener.onCheckedChanged(isChecked());
        }
    }
});

第2步

在方法toggle()中,它将调用:

@Override
public void setChecked(boolean checked) {
    ....
    if (checked) {
        startCheckedAnimation();
    } else {
        startUnCheckedAnimation();
    }
}

第3步

我们说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()

2 个答案:

答案 0 :(得分:0)

View#clearAnimation()将取消已应用于View的所有动画。

在您的情况下,您使用的是ValueAnimator,这意味着您必须保留对它的引用,当您需要取消动画时,您应该执行ValueAnimator#cancel()



private ValueAnimator circleAnimator;

...

circleAnimator = ValueAnimator.ofFloat(0f, 1f);
// setup and start `ValueAnimator`


然后,当需要取消动画时:



circleAnimator.cancel();


答案 1 :(得分:-1)

我认为您可以使用removeCallbacks(Runnable r)方法。

  

void removeCallbacks (Runnable r)

删除邮件队列中的Runnable r的所有待处理帖子。