Android 使用invalidate的自定义视图动画有时不会触发onDraw()
我正在编写一个自定义视图,其中我使用onDraw(canvas canvas)方法将自己绘制到画布上。 我的想法是,在视图变得可见时,使用ObjectAnimator和视图中特定变量的setter来设置视图的动画。类如下所示: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
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相同的想法: