4

同時に 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を使用して、次のフレームで両方のウィンドウの表示を変更することも試みましたが、完全な同期を達成できませんでした。

誰か別のアイデアがありますか?

4

0 に答える 0