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


 

重構了下之前自己的一個新聞客戶端,全部使用了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切換時閃一下黑屏的解決辦法,希望對大家有所幫助。

 

備注:目前使用的方法一,解決了問題

其他可參考鏈接:http://blog.csdn.net/aikongmeng/article/details/49125437


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM