同時に 2 つのウィンドウを表示するアプリケーションがあります。ウィンドウ A には が表示され、SurfaceView
ウィンドウ B にはビューが表示されます。各ウィンドウには (当然のことながら) そのウィンドウに関連付けられた独自のサーフェスがあります。現在、ウィンドウ A のみSurfaceView
が画面上に表示され、ウィンドウ B には何も表示されません。ユーザーがちらつきを気にしたり、2 つのウィンドウを同時に表示したりせずに、2 つのウィンドウを切り替えたい。結論として、私は次の効果を達成したいと考えています。
ウィンドウ A -> SurfaceView A を隠す
ウィンドウ B -> ビュー B を表示
両方がまったく同時に起こっています。
私が直面している問題は、ディスプレイを同期しようとしても、各ウィンドウがわずかに異なる時間枠でそのビューを表示/非表示にするため、画面がちらついたり、2 つのビューが表示されたりすることです。
私は次の方法を試しました:
スレッド A -> ビュー A を非表示 -> 描画の準備 (
lockCanvas
) を行い、シグナルを受信するまでスレッドを停止 (待機) します。スレッド B (UI スレッド) -> SurfaceView B を表示 -> ビューの をオーバーライドし、
draw
スレッド A に自身を解放するように信号を送ってから、描画します。スレッド A -> 信号を受信して画面に描画 (
unlockAndPostCanvas
)
実際には、一貫性のない結果が得られ、2 つのウィンドウが常に同期しているわけではありませんでした。2 つのビューを並べて表示するフレームが表示されることもあれば、ビューがまったくないフレームが表示されることもあります。Choreographer.postFrameCallbackを使用して、次のフレームで両方のウィンドウの表示を変更することも試みましたが、完全な同期を達成できませんでした。
誰か別のアイデアがありますか?