Android: SurfaceView игнорирует postInvalidate ()? - PullRequest
3 голосов
/ 30 марта 2011

Я впервые использую это, так что я не уверен, является ли это ошибкой в ​​моем коде, или я пытаюсь сделать что-то, что не разрешено.

В настоящее время у меня есть 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 Ответ

4 голосов
/ 30 марта 2011

Ты кровавая легенда, Каран!

Это указало мне на правильный путь. Я нашел несколько сообщений, в которых упоминалось, что это должно быть сделано в методе surfaceCreated () , а не в конструкторе, и он получил postInvalidate () , работающий.

Однако, включение этого параметра приведет к отключению любого рисунка, выполненного моим пользовательским DrawThread . Хорошо, что должно быть легко найти подходящий момент времени для слота в этом вызове.

Еще раз спасибо, View.setWillNotDraw () добился цели.

...