我正在编写一个自定义视图,我在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