Android FragmentでSurfaceViewを使用して切り替えるときに黒画面を点滅させる解決策
1908 ワード
以前の自分の1つのニュースクライアントを再構築し、すべてFragmentを使用してページ切り替えを行い、1つのエントリActivityだけがプログラムの起動Activityとして機能し、そのうち1つのインタフェースがカメラを呼び出してQRコードを認識する必要があるため、SurfaceViewで予覧すると問題が発生し、対応するFragmentに切り替えると画面が黒くなり、1秒ほど黒くなると通常のインタフェースが表示され、しかもこの現象は初めてこのFragmentに入ってからしか現れず、その後入っても現れず、解決方法はgithubで何気なく見たので、試してみたら、通じるので、下に解決方法を貼ってみました.
方法一、ActivityのonCreateに次のコードを追加する
しかし、fragmentでそうするのは通用しないようです.
方法2、activityのroot viewに長さ幅が0 pxでSurface View要素が見えないものを加える.
理由:
SurfaceViewは一般的なviewとは異なるため、独自のバッファリングとデータアクセスメカニズムがあり、システムは彼に特別な処理をしています.surfaceviewが現在のactivityに初めて追加されると、WindowManagerにレイアウトが再配置され、relayoutされ、黒くなります.これは初めてで、後でsurfaceviewを追加すると黒くなりません.
自分のプロジェクトでは、すべてfragmentを使用してページを切り替えるため、リストファイルにactivity宣言が1つしかありませんが、コードにはfragmentコンテナとしてactivityを新しく開くかどうかを構成することができます.このactivityにコードgetWindow()を追加したくないからです.setFormat(PixelFormat.TRANSLUCENT);,そこで私はこのfragmentの容器として新しいactivityを使用し、問題も解決しました.
フラッシュスクリーンのあるコードはこうです
しかし、この関数には、新しいactivityを開くかどうかというリロード関数があります.ここでは、リロード関数を使用して解決します.
関数プロトタイプ
以上、本稿で共有するAndroid FragmentでSurfaceViewを切り替えたときに黒い画面を点滅させる解決策をご紹介します.
方法一、ActivityのonCreateに次のコードを追加する
getWindow().setFormat(PixelFormat.TRANSLUCENT);
しかし、fragmentでそうするのは通用しないようです.
方法2、activityのroot viewに長さ幅が0 pxでSurface View要素が見えないものを加える.
理由:
SurfaceViewは一般的なviewとは異なるため、独自のバッファリングとデータアクセスメカニズムがあり、システムは彼に特別な処理をしています.surfaceviewが現在のactivityに初めて追加されると、WindowManagerにレイアウトが再配置され、relayoutされ、黒くなります.これは初めてで、後でsurfaceviewを追加すると黒くなりません.
自分のプロジェクトでは、すべてfragmentを使用してページを切り替えるため、リストファイルにactivity宣言が1つしかありませんが、コードにはfragmentコンテナとしてactivityを新しく開くかどうかを構成することができます.このactivityにコードgetWindow()を追加したくないからです.setFormat(PixelFormat.TRANSLUCENT);,そこで私はこのfragmentの容器として新しいactivityを使用し、問題も解決しました.
フラッシュスクリーンのあるコードはこうです
private static final int REQUEST_CODE_SCAN = 1;
openPageForResult("scan",null,CoreAnim.slide,REQUEST_CODE_SCAN);
しかし、この関数には、新しいactivityを開くかどうかというリロード関数があります.ここでは、リロード関数を使用して解決します.
private static final int REQUEST_CODE_SCAN = 1;
openPageForResult(true,"scan",null,CoreAnim.slide,REQUEST_CODE_SCAN);
関数プロトタイプ
/**
* fragment , activity
* @param newActivity activity
* @param pageName
* @param bundle
* @param coreAnim
* @param requestCode
* @return fragment
*/
public final Fragment openPageForResult(boolean newActivity, String pageName, Bundle bundle, CoreAnim coreAnim, int requestCode);
以上、本稿で共有するAndroid FragmentでSurfaceViewを切り替えたときに黒い画面を点滅させる解決策をご紹介します.