这是我第一次使用它,所以我不确定它是否是我的代码中的错误,或者我正在尝试做一些不允许的事情。
目前,我有一个 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() 方法将 Canvas 传递给另一个称为 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() 感到困惑。为了让它工作,我需要做任何标志或初始化吗?
欢迎任何建议或理论。
谢谢!
最佳答案
你该死的传奇卡兰!
这给我指出了正确的方式。
我发现一些帖子提到它必须在 surfaceCreated() 方法而不是构造函数中完成,并且它让 postInvalidate() 工作。
但是,启用它会禁用我的自定义 DrawThread 完成的任何绘图。
好消息是应该很容易找到一个合适的时间点来插入该调用。
再次感谢, View.setWillNotDraw() 做到了。
关于Android:SurfaceView 忽略 postInvalidate()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5479907/