1. 程式人生 > >使用VIEWPAGER+SURFACEVIEW實現視訊的迴圈滑動播放(一)

使用VIEWPAGER+SURFACEVIEW實現視訊的迴圈滑動播放(一)

難點

這裡的難點主要就在需要迴圈播放。
因為需要使用迴圈播放,就不能使用LISTVIEW/RECYCLERVIEW這種易於實現的控制元件。
本文還是使用VIERPAGER來做切換。

實現思路

一般來說VIEWPAGER的迴圈切換有幾種方式
https://github.com/imbryk/LoopingViewPager
這是一種解決方案。但是在1->N的過程中會有實際的座標跳變,內嵌播放器的話就會體驗很差,還無法確定播放的時間點。
因此還是採用MAX_COUNT的迴圈解決方案。

設計

預設採用10個播放器輪詢,那麼問題來了?開十個播放器執行緒去等待START麼?
這個方案明顯不靠譜。
目前的做法是:
1.寫一個包含SURFACE的自定義LAYOUT,裡面包含目標URL,使用的MEDIAPLAYER等資源。
2.在VIEW建立的時候,去建立對應VIEW的MEDIAPLAYER。
3.在VIEW移除時,將對應的MEDIAPLAYER釋放,這樣保證同時只有3個活躍的MEDIAPLAYER。
4.使用VIEWPAGER的滑動監聽,來處理內部MEDIA的播放狀態。

需要填的坑

1.讀取raw/asset的資源方法,請自行搜尋。
2.預設當前頁自動播放,第一個頁面需要專門去觸發播放,後續的頁面由滑動來觸發播放。這裡需要特殊處理。
3.需要考慮旋屏和影象的適配。這裡坑比較多
旋屏黑屏請自行處理,看看是不是走ONCREATE了。需要註冊ACTIVITY的configChanges .
FIXSIZE是設定SURFACEVIEW解析度不是SURFACEVIEW的控制元件大小。
SURFACEVIEW的控制元件大小由:

FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) surface.getLayoutParams();
layoutParams.height = finalheight;
layoutParams.width = finalwidth;
surface.setLayoutParams(layoutParams);


設定surfaceview的LAYOUT來進行大小轉換。
然後還有一個比較坑的,可用螢幕大小,不要使用上一層的FRAMELAYOUT屬性,因為可能走進來的時候,FRAMELAYOUT渲染還沒有結束,獲取到的尺寸不對,還是用螢幕大小來適配。

未填完的坑

1.在快速滑動的時候,可能會出現播放器異常。用金山的播放器替換MEDIAPLAYER後稍有改善。這個涉及底層修改估計沒戲了。
2.需要設計一下SURFACEVIEW有下滑內容的處理邏輯。
3. 中間有個CLICK的按鈕,我懶了,暫時沒有做成圖形按鈕。這個要跟COMPLETE一起來做。