串列中自動播放視頻,常規方案是在每個 xml 中寫入視頻布局,然后在滑動時獲取當前的下標,播放此下標的視頻
弊端:播放容易出錯,需要精準控制好停止播放操作,并且配接器中容易觸發多次重繪,導致執行多次同樣的操作,不易控制離開停止等操作,增加了布局的負擔,影響滑動流暢度,無法復用...
使用過的都比較清楚這些弊端,所以需要一套統一的播放邏輯控制,并且播放中的視頻只有一個,方便控制
大致思路就是在當前的下標布局中,動態注入一個視頻布局,然后去控制這個布局的狀態,滑動時移除
優點:跟展示串列分離,容易控制,可復用,不影響串列滑動流暢度
實作流程
1、在xml中撰寫好播放布局,然后 inflate 加載布局 videoLayout,并且系結生命周期控制釋放,在把需要監聽的 Recyclerview 傳進來,設定好滑動監聽
2、獲取到當前下標,并且拿到該下標(viewholder)的根布局
3、拿到該下標的物體類(播放路徑等)
4、拿到的根布局呼叫系統方法 viewholderRoot.addView(videoLayout) ,把需要播放的布局添加進 viewholder 中
5、使用 WeakReference 弱參考持有當前工具類,然后在 Handler 中去控制播放等方法
private class WeakReferenceHandler(tag: AutoPlayVideoUtils) : Handler() { private val mView = WeakReference(tag) override fun handleMessage(msg: Message) { when (msg.what) { MSG_LOAD_VIDEO -> mView.get()?.startVideo(msg.obj as VideoData) } } }
6、在監聽的滑動事件中判斷可見范圍,然后移除播放布局 videoLayout
root?.parent?.let { if (it is ViewGroup) { val video = root.findViewById<VideoPlayerView>(R.id.video_player_view) if (video?.isPlaying == true) { video.pause() video.stop() } it.removeView(root) videoPlayerView = null rootView = null } }
此時基本流程完成
實際專案中還有很多需要處理
比如滑動時如果可見下標想等,需要跳過邏輯,不用執行播放操作,然后滑動中監聽是否可見,什么時候添加布局跟移除布局
比如在生命周期中恢復,暫停,釋放
所幸 Recyclerview 中有滑動停止監聽,可以很好的監聽控制
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/542055.html
標籤:Android
