安卓:SurfaceView忽略postInvalidate()?

3

这是我第一次使用它,所以我不确定是我的代码有bug还是我正在尝试做一些不允许的事情。

目前,我有一个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() 没有被调用。是否需要设置任何标志或初始化才能使其正常工作?
欢迎提供任何建议或理论。 谢谢!

6
SurfaceView 调用 setWillNotDraw(true) 可能会忽略此调用。请尝试将其设置为 false,看看是否会调用 draw 方法。 - Karan
1个回答

5

你真是个了不起的Karan!

你给我指明了正确的方向。 我找到了一些帖子,提到它必须在surfaceCreated()方法中完成,而不能在构造函数中完成,这样可以使postInvalidate()正常工作。

然而,启用此功能将禁用我自定义的DrawThread所做的任何绘图。 好消息是应该很容易找到一个适当的时间点来插入该调用。

再次感谢,View.setWillNotDraw()起了关键作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接