最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

世界今日报丨Recyclerview列表视频自动播放方案

来源:博客园

列表中自动播放视频,常规方案是在每个 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(R.id.video_player_view)                if (video?.isPlaying == true) {                    video.pause()                    video.stop()                }                it.removeView(root)                videoPlayerView = null                rootView = null            }        }

此时基本流程完成

实际项目中还有很多需要处理

比如滑动时如果可见下标想等,需要跳过逻辑,不用执行播放操作,然后滑动中监听是否可见,什么时候添加布局跟移除布局

比如在生命周期中恢复,暂停,释放

所幸 Recyclerview 中有滑动停止监听,可以很好的监听控制

关键词: 生命周期 自动播放 停止播放