Android Fragment中使用SurfaceView切換時閃一下黑屏的解決辦法

NO IMAGE

重構了下之前自己的一個新聞客戶端,全部使用了Fragment來進行頁面切換,只有一個入口Activity作為程式的啟動Activity,其中有一個介面需要呼叫攝像頭識別二維碼,於是就會用到SurfaceView進行預覽,那麼問題來了,當切換到對應的Fragment時,螢幕會黑一下,黑了1秒左右就顯示出正常的介面,而且這種現象只有第一次進入該Fragment才會出現,之後進入都不會出現,解決方法是無意在github上看到了,試了一下,可以行的通,下面貼出解決方法。

方法一、在Activity的onCreate中新增如下程式碼

複製程式碼 程式碼如下:
getWindow().setFormat(PixelFormat.TRANSLUCENT); 

但是如果你在fragment裡這麼做貌似是行不通的。

方法二、在activity 的 root view 裡面 加入一個 長寬都是0px的並且不可見SurfaceView元素 。

原因:

SurfaceView因為不同於一般的view,它有自己良好的緩衝以及資料存取機制,系統對他有特殊處理。當surfaceview第一次在當前activity上新增的時候,系統會給WindowManager重新排佈局,relayout,這樣就會黑一下,這個只會出現在第一次,以後再新增surfaceview時就不會黑屏了。

而自己專案中,由於全部使用fragment進行切換頁面,只有一個activity宣告在清單檔案中,但是程式碼中是可以配置是否新開activity作為fragment容器的,由於我不想再這個activity中增加程式碼getWindow().setFormat(PixelFormat.TRANSLUCENT);,於是我使用了新開activity作為這個fragment的容器,於是問題也得以解決。

有閃屏的程式碼是這樣的


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切換時閃一下黑屏的解決辦法,希望對大家有所幫助。

您可能感興趣的文章:

Android中Fragment相互切換間不被回收的實現方法Android-實現切換Fragment頁功能的實現程式碼一個Activity中多個Fragment的切換Android UI實現底部切換標籤fragmentAndroid 儲存Fragment 切換狀態例項程式碼Android App中使用ViewPager Fragment實現滑動切換效果Android中使用TabHost 與 Fragment 製作頁面切換效果Android使用Fragment打造萬能頁面切換框架Android基礎之使用Fragment控制切換多個頁面anndroid使用ViewPager實現三個fragment切換