Android:SurfaceView 忽略 postInvalidate()?

标签 android surfaceview ondraw

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

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

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/

相关文章:

android - picasso 图像缓存

安卓词典应用

android - 确定 Android 上的确切屏幕翻转时间

Android Surfaceview 线程和内存泄漏

android - 在前置摄像头上拉伸(stretch)相机预览

java - Android OnDraw 和 onTouchEvent 不能一起工作

java - 如何创建应用程序日志并保存?

android - Android SurfaceView 上的缩放效果

android - 5.1 like elevation Shadow under a View using onDraw 方法

java - 自定义 View 类的 onDraw 未被 Invalidate 调用