VideoView加載閃黑屏

最近在開發中遇到了一個問題:從A頁面跳到B頁面,B頁面包含VideoView,然後屏幕會快速的閃過一個黑屏,很影響用戶體驗度。


情境:
新人Android開發者小明正在開發公司的項目,項目裏面包含的有視頻播放,但是遇到一個問題,每次進入視頻播放界面的時候,都會閃下黑屏,以前他完全沒有注意這個問題,這個問題卻被他的項目經理提出來了,小明開始百思,但都不得其解。
小明決定今天一定要解決這個問題,然後他就瘋狂的在網上尋求答案,谷歌也好,百度也好,百度來谷歌去,都只找到了一個答案,就是

在onCreate 添加 getWindow().setFormat(PixelFormat.TRANSLUCENT); 

然而這個解決方法對小明的項目並沒有什麼卵用,小明開始着急了,決定開始從SurfaceView入手,學習了SurfaceView的機制,但是還是沒有發現解決思路,直到通過谷歌搜索看到了這個,根據裏面的描述

界面中設置一個button,然後通過點擊button,動態加載自己實現的view(此view繼承自surfaceview),此時整個activity會重新加載一次,此種情況只會在第一次加載view的時候出現,後面都不會出現。

然後提供了一個方案:

問題如下:某個時候需要切換到SurfaceView,我們不管是用setContentView(xxxlayout);這個xxxLayout裏面有個SurfaceView、還是用動態添加SurfaceView(layout.addView(mSurfaceView));的方法,都會閃屏一下。但是,關鍵是隻會閃一下,然後以後再進來就不會閃屏了。(如果程序退出,再次啓動,第一次需要SurfaceView的時候都會閃屏一下)

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

解決方法:既然知道這種問題原因所在了,那麼,可以在沒有進入surfaceview的界面(比如很多程序一進去就有個Loading界面)的時候,在其它界面的layout
xml文件中添加一個SurfaceView,寬和高都弄成0dp,這樣對佈局沒影響,而且這個東西使得surfaceview第一次出現了,那麼也就是說,下一次我們真正用到SurfaceView的時候就不會閃屏了。

小明通過以上方案,在使用VideoView之前的一個佈局中悄悄的寫了一個沒有id,只有寬高,並且寬高都爲0dp的VideoView,然後運行了,再也不閃黑屏了!但是小明想到了另一個問題,爲什麼寬高爲0的這個界面被創建的時候不會閃下黑屏,小明很希望有大神告訴他爲什麼,但是在這之前,小明要提交代碼後,美美的睡一覺了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章