3

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

目前,我有一个 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() 没有被调用感到困惑。为了让它工作,我需要做任何标志或初始化吗?

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

4

1 回答 1

5

你这个该死的传奇卡兰!

这为我指明了正确的方向。我发现一些帖子提到它必须在surfaceCreated()方法而不是构造函数中完成,并且它使postInvalidate()工作。

但是,启用它会禁用我的自定义DrawThread完成的任何绘图。好消息是应该很容易找到一个合适的时间点来参与该呼叫。

再次感谢,View.setWillNotDraw()成功了。

于 2011-03-30T09:08:07.093 回答