Android:SurfaceView忽略postInvalidate()?

时间:2011-03-29 22:58:08

标签: android surfaceview ondraw

这是我第一次使用它,所以我不确定它是否是我的代码中的错误,或者我正在尝试做一些不允许的事情。

目前,我有一个DrawThread(),它在run方法中执行此操作。

try {
  c = m_surfaceHolder.lockCanvas(null);
  synchronized (m_surfaceHolder) {
    m_view.onDraw(c);
  }
}
finally {
  if (c != null) {
    m_surfaceHolder.unlockCanvasAndPost(c);
  }
}

在这个绘图线程(非UI线程)中,我的onDraw()方法将画布传递给另一个名为drawScoreboard()的方法。我希望这种方法在显示记分板的每一行之间有一个短暂的延迟,所以我添加了一个postInvalidateDelay(x),希望它再次触发onDraw()。

/**
 * A helper function which draws the scoreboard.
 */
private void drawScoreboard(Canvas canvas) {
  long delay = m_drawScoreboard.draw(canvas, m_paint);

  if (delay > 0) {
    this.postInvalidateDelayed(delay);
  }
}

代码正确执行并且正在调用postInvalidateDelayed(),但我很困惑为什么没有调用onDraw()。为了让这个工作起作用,我需要做任何标记或初始化吗?

欢迎任何建议或理论。 谢谢!

1 个答案:

答案 0 :(得分:4)

你是血腥的传说Karan!

那是以正确的方式指出了我。 我发现有一些帖子提到它必须在 surfaceCreated()方法而不是构造函数中完成,它使 postInvalidate()工作。

但是,启用此功能会禁用我的自定义 DrawThread 所做的任何绘图。 好的是,应该很容易找到一个很好的时间来插入该电话。

再次感谢, View.setWillNotDraw()完成了这一操作。