3

これを使用するのは初めてなので、コードのバグなのか、許可されていないことをしようとしているのかわからない.

現在、run メソッドでこれを行う DrawThread() があります。

try {
  c = m_surfaceHolder.lockCanvas(null);
  synchronized (m_surfaceHolder) {
    m_view.onDraw(c);
  }
}
finally {
  if (c != null) {
    m_surfaceHolder.unlockCanvasAndPost(c);
  }
}

この描画スレッド (非 UI スレッド) では、onDraw() メソッドがキャンバスを drawScoreboard() という別のメソッドに渡します。このメソッドがスコアボードの各行を表示する間に短い遅延を持たせたかったので、onDraw() が再度トリガーされることを期待して postInvalidateDelay(x) を追加しました。

/**
 * 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() IS が呼び出されますが、onDraw() が呼び出されない理由に困惑しています。これを機能させるために必要なフラグや初期化はありますか?

アドバイスや理論は大歓迎です。ありがとう!

4

1 に答える 1

5

血まみれの伝説のカラン!

それは正しい方法で私を指摘しました。コンストラクターではなくsurfaceCreated()メソッドで実行する必要があり、 postInvalidate()が機能するようになったという投稿をいくつか見つけました。

ただし、それを有効にすると、カスタムDrawThreadによって行われた描画が無効になります。良いことは、その通話を開始するのに適した時点を簡単に見つけることができることです。

ありがとう、View.setWillNotDraw()はうまくいきました。

于 2011-03-30T09:08:07.093 に答える