Android 使用invalidate的自定义视图动画有时不会触发onDraw()

Android 使用invalidate的自定义视图动画有时不会触发onDraw(),android,animation,android-animation,Android,Animation,Android Animation,我正在编写一个自定义视图,其中我使用onDraw(canvas canvas)方法将自己绘制到画布上。 我的想法是,在视图变得可见时,使用ObjectAnimator和视图中特定变量的setter来设置视图的动画。类如下所示: public DrawView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, -1); } public DrawView(Conte

我正在编写一个自定义视图,其中我使用onDraw(canvas canvas)方法将自己绘制到画布上。 我的想法是,在视图变得可见时,使用ObjectAnimator和视图中特定变量的setter来设置视图的动画。类如下所示:

public DrawView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs, -1);
}

public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public DrawView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context, attrs, defStyleAttr);
}

private void init(final Context context, AttributeSet attrs, int defStyleAttr) {

    anim = ObjectAnimator.ofInt(this, PROGRESS, 0, 100);
    anim.setDuration(animDuration);

    if (getVisibility() == VISIBLE) {
        getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                getViewTreeObserver().removeOnPreDrawListener(this);


                animate();


                return true;
            }
        });
    }

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // Draw something here using progress
}

protected void setProgress(final int pathProgressParam) {
        // Re-draw
        invalidate();
    }

}
触发动画时,将正确调用“setProgress”方法,视图将失效,以强制使用my progress字段的新值重新绘制。 问题是,有时,比如说30%的时候,即使视图被标记为“脏”,也不会调用onDraw方法,并且只绘制最后一帧,这有点违背了动画的目的

我不知道在绘图周期中是否有更好的步骤来触发动画,或者我是否应该从其他地方触发动画,但似乎invalidate()是不够的。我还研究了安卓玩家如何执行属性动画,但不幸的是,他们使用的方法是隐藏的。 顺便说一句,我在这里使用了与Romain Guy相同的想法: