2

多くの苦労の末、aは自分のSurfaceViewやりたいことを実行しないと判断しました。つまり、一部の UI 要素の上に配置し、他の要素の下に配置するということです。また、すべての UI 要素を に描画するのSurfaceViewは、置き換えようとしていた多層階層よりも実際には大幅に遅いことも発見しました。Viewしたがって、を使用して独自のアニメーションをコーディングしようとしていますonDraw()

これについて私が考えることができる最も簡単な方法は、おおよそ次のとおりです。

  1. 今すぐ時間を測る
  2. アニメーションの状態に関する計算を実行する
  3. 電話invalidate()
  4. でアニメーションを描くonDraw()
  5. 1に戻ります。

nextFrame()ステップ 1 と 2 を実行する my からの関数が既にSurfaceViewあり、draw 関数は実際には単純で、単一のパスです。私はnextFrame()電話をかけることができ、描画が完了し、次のフレームの準備ができていることを知らせるinvalidate()ためにonDraw()電話をかけることができます. nextFrame()残念ながら、これが問題を引き起こしていることは想像できます。

invalidate()を直接呼び出しonDraw()ますか? のように呼び出しスレッドを実装する必要がありSurfaceViewますか?

4

2 に答える 2

5

いいえ、スタック オーバーフローは発生しません。

于 2012-06-29T11:56:01.347 に答える
0

invalidate() を呼び出すと、onDraw(canvas c) が呼び出されると想定できます。

ただし、onDraw() 内で nextFrame を呼び出す場合は注意してください。更新時間を必ず制御してください。

onDraw(Canvas c) メソッドを実装したい場合は、それをオーバーライドするだけで、好きなように描画できます。

現在の時刻に基づいて更新時間を制御する場合:

メソッド 1 内で、現在の時刻を制御していると述べました。

//I assume you instantiate the lasTTime in the     onCreate()

void method1() {
    while (currentTime - lastTime < N) {
        currentTime = //call the current time as you do
    }
    lastTime = currentTime;
    //call method2
}
于 2012-06-29T09:34:18.543 に答える