Android FragmentでSurfaceViewを使用して切り替えるときに黒画面を点滅させる解決策

1908 ワード

以前の自分の1つのニュースクライアントを再構築し、すべてFragmentを使用してページ切り替えを行い、1つのエントリActivityだけがプログラムの起動Activityとして機能し、そのうち1つのインタフェースがカメラを呼び出してQRコードを認識する必要があるため、SurfaceViewで予覧すると問題が発生し、対応するFragmentに切り替えると画面が黒くなり、1秒ほど黒くなると通常のインタフェースが表示され、しかもこの現象は初めてこのFragmentに入ってからしか現れず、その後入っても現れず、解決方法はgithubで何気なく見たので、試してみたら、通じるので、下に解決方法を貼ってみました.
方法一、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を切り替えたときに黒い画面を点滅させる解決策をご紹介します.