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

时间:2016-01-19 13:23:51

标签: android animation android-animation

我正在编写一个自定义视图,我在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"方法被正确调用,并且视图无效以强制使用我的进度字段的新值重新绘制。 问题来自有时候,让我们说30%的时间,即使View被标记为"脏"并且只绘制了最后一帧,onDraw方法也不会被调用,有点打败了动画的目的。

我不知道在绘制周期中是否有更好的步骤来触发动画,如果我应该从其他地方触发它,但似乎invalidate()是不够的。我还看过Android人员如何执行属性动画,但不幸的是他们使用的方法是隐藏的。 顺便说一句,我使用了与Romain Guy在这里做过的相同的想法:https://github.com/romainguy/road-trip

0 个答案:

没有答案