列表中自动播放视频,常规方案是在每个 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 中有滑动停止监听,可以很好的监听控制
标签:下标,布局,列表,video,自动播放,滑动,播放,Recyclerview,监听 From: https://www.cnblogs.com/LiuZhen/p/17054491.html