android 佈局檔案定義的SurfaceView閃屏,挖空佈局,以及佔用其他佈局等問題解決辦法

android  佈局檔案定義的SurfaceView閃屏,挖空佈局,以及佔用其他佈局等問題解決辦法

網上提供了很多關於SurfaceView閃屏的解決辦法,但是有的可以,有的不可以,下面是關於我在專案中出現的SurfaceView閃屏解決辦法。期間遇到三個問題

我的專案是在Listview中嵌入視訊列表播放器,所以在Listview的Item佈局中定義了SurfaceView,如下:

問題一:閃屏

	<FrameLayout
android:layout_width="match_parent"
android:layout_height="202dp"
android:id="@ id/lay_min_video"
android:background="#000000"
android:layout_gravity="center_horizontal">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/min_video_view"
android:layout_gravity="center"
android:background="#00000000"/>
<ImageView 
android:id="@ id/min_video_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
<ImageView
android:id="@ id/play_controll"
android:layout_width="55dip"
android:layout_height="55dip"
android:scaleType="fitXY"
android:layout_gravity="center"
android:src="@drawable/play_minvideo_play_button"/>
<ProgressBar
android:id="@ id/video_bar"
android:layout_width="50dp"
android:layout_height="50dp"
style="@android:style/Widget.ProgressBar"
android:indeterminateDrawable="@drawable/thailand_video_progressbar_bg"
android:layout_gravity="center"
android:visibility="gone" />
<ProgressBar
android:id="@ id/video_progress"
android:layout_width="match_parent"
android:layout_height="3dp"
style="@android:style/Widget.ProgressBar.Horizontal"
android:progressDrawable="@drawable/thailand_progress_bg"
android:layout_gravity="bottom" 
android:visibility="gone"/>
</FrameLayout>

但是每次進入都會出現閃屏,我得解決辦法是需要兩步:

第一步:和部分網友提供的答案一樣,在定義Listview的佈局檔案最底層新增一個寬高為0dp的SurfaceView,如圖:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/activity_layout_bg">
<SurfaceView
android:layout_width="0dp"
android:layout_height="0dp" />
<com.lgshouyou.vrclient.thailand.MyListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/common_listview"
android:verticalSpacing="1dp"
android:listSelector="@color/transparent_color"
android:scrollbars="none"/>     		 			 
</FrameLayout>

但是隻是實現這一步並不能解決問題,不是必出但是偶爾還是會出現閃屏,沒辦法就試著在Activity中新增

第二步:getWindow().setFormat(PixelFormat.TRANSPARENT); 

之後就沒出現閃屏了。

問題二:佔用其他佈局

因為我的視訊播放列表是在Fragment中定義的,所以在Fragment之間切換會出現一種現象,正在播放視訊的播放器模組item佔用了的其他佈局,如圖所示,圖一是上滑之前的正在播放的視訊item,圖二是上滑一部分切換Fragment之後,在切回來之後的效果,可以看到上滑一部分後切換Fragment,可以看到部分標題欄的介面被SurfaceView穿透,解決辦法就是將SurfaceView的背景設定為透明,有時會佔用整個標題欄目

 

 

問題三:挖空底部佈局

有時首次進入或者home鍵之後會在SurfaceView渲染好之前,會把Activity挖空,露出底下的Activity的內容,以上第一個問題可以解決首次挖空問題,home鍵之後這種問題可以通過上面覆蓋一個ImageView解決,這種問題都是由於SurfaceView在渲染的時候應該是將所有在它下面的全部View都“挖空”,然後渲染自己。