19

私はポートレートモードで再生するビデオを持っています。ビデオの終わりに、いくつかのビューを表示する必要があります。これはこれまでのところうまく動作します。Android - フルスクリーンビデオの最後のフレームにオーバーレイされたビューは、画面のオン/オフ時に正しく再描画されません。

しかし、ビデオの最後のフレームを超えているビューは、画面の電源を切ってから再びアクティビティに戻ったときに正しく再描画されず、画面のロックが解除されるという問題があります。

私が観察しているのは、画面が再び表示され、ロックが解除されたときです。私のビデオと画像は、まずフルスクリーンモードの外でレンダリングされ(ステータスバーはまだ表示されています)、画面はすべてのビューをシフトしてアーチファクトを引き起こすフルスクリーンモードになります。

レンダリング後、フルスクリーンへの遷移によってビューがビュー境界からシフトされているようです。

私は実際にこれが起こるのを防ぐ方法については困惑しています。

Here is the sandbox project on githubこれをコードの完全な部分にすることを避けるためです。

プロジェクトのための基本的な設定はこれです:

フラグメントの活動は、ビデオビューおよびそれのレイアウト上のボタン表示されています。 次に、contentViewコンテナにフラグメントを追加します。 contentViewは、ビデオ再生の終了前に1秒間フェードインします。

すべてがスムーズに機能し、問題は画面の電源を入れた後にアプリに戻ることです。

また、ビデオは完全にドロップアウトされ、ビューは黒い背景の上に座っています。

お手数ですがお寄せいただきありがとうございます。

proper rendering of views over video

ここでは、背面に、画面をオフにし、ロックを解除する場合に発生するアーチファクトです。 私はそれを撮らなければならないことに注意してください。 DDMSでは、スクリーンショットツールがイメージを適切に表示します。

artifacted image

答えて

3

スクリーンをオフにするのではなく、ユーザーが携帯電話を覚醒させた後に、キーガードのロックを解除したときにイベントを受信することができます。

この時点で、両方のビューでView.invalidateと呼ぶことをお勧めします。これは再描画を引き起こすはずです。あなたのアプリは技術的に見えるので、ロック画面の下にあるので、ロック画面が表示されている間、ドローチェーンは非常に薄れています。

registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context ctx, Intent intent) { 
      if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 

     } 
    }, new IntentFilter(Intent.ACTION_USER_PRESENT)); 
+0

提案してくれてありがとうColin。私はそれを試してみましょう。 –

+0

np!それがうまくいってほしい:) –

+0

ありがとうコリン。これは間違いなく助けになりました。私はまだそれを修正する方法を理解していませんでしたが、あなたの提案は問題を示しています。問題は、ロック画面を表示しているときにonResumeが呼び出されることです。ロック画面でステータスバーが表示され、不適切な描画が行われます。ユーザーの意図を受け入れることで、問題を解決するのに役立ちます。ここで問題となるのは、ビューの無効化を呼び出すと効果がないように見えることです。しかし、それは簡単な部分でなければなりません。再度、感謝します! –

0

オーバーレイのレイアウトは、コントローラバーにシフトしたように見えます。
コントローラー(再生/一時停止/ ff/rew +進行)領域の影響を受けていないと思いませんか?

+0

hi JonA。よく分からない。私はこのmediaplayerインスタンスのためにコントローラを設定していません。しかし、コントローラーバーが干渉しないようにするために何かすべきことはありますか? –

0

画面が1位で消えるのを防ぐ方法があるかもしれません。これは、再描画の問題を解決するのに良い方法ですから、これが役立ちます。

関連する問題