首页 > 其他分享 >Recyclerview列表视频自动播放方案

Recyclerview列表视频自动播放方案

时间:2023-01-15 23:58:30浏览次数:38  
标签:下标 布局 列表 video 自动播放 滑动 播放 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<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

相关文章

  • 新手最应记住和收藏的 Mac 键盘快捷键列表整理
    最近趁着「苹果教育优惠免费送AirPods」,很多同学都纷纷入手了新的Mac!然而对于初次接触macOS的朋友来说,除了要寻找不同的APP软件之外,还有一件事情也直接影响着使用电脑......
  • springboot url中获取所有RequestMapping的URL路径列表集
    springboot项目在做URL权限控制的时候需要获取全部的URL,一个一个去controller中找费时费力,有的权限点的命名和URL有一定的对应关系。如果能用程序获得全部URL,将会省去很......
  • hyper-v 尝试检索虚拟交换机列表时出错
    百度了一下找不到答案,经过一通折腾好了,具体如何好的不清楚。1卸载desktopdocker如果还不行再执行下面的2在启动/关闭windows功能中卸载hyper-v卸载适用于Linux的w......
  • 为什么你应该使用NumPy数组而不是嵌套的Python列表?
    在本文中,我们将向您展示为什么使用NumPy数组而不是嵌套的Python列表,以及它们之间的异同。PythonNumPyLibraryNumPy是一个Python库,旨在有效地处理Python中的数组。......
  • 详解Python列表和元组
    (详解Python的列表和元组)1序列序列是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。Python序列结构主要有列表、......
  • python opencv通过读取图像数据列表文件来检查图像数据是否存在错误
    python3.9环境,opencv3.4:平时在准备深度学习数据集时,会有图像和对应的图像列表文件,可以使用opencv通过列表文件来读取图像,看是否存在错误数据:使用python脚本来检查数据:impor......
  • 开发一个微信小程序(2):编写博客园随笔列表
    上一篇介绍了如何通过博客园官方api获取随笔列表,本篇来实现把文章展示到小程序中 先来看一下最终的效果1、调用获取access_token接口如果想在小程序中成功调用接口,需要在......
  • 备份outlook收件人地址列表
       在Outlook中,正常情况下,在收件人地址栏中输入一个字母能以列表显示发送过的收件人地址。但是当重装系统、重建个人帐户配置档时,这些地址列表会丢失,那能否备份outlook......
  • py教学之列表
    列表是什么list是一些元素按照一定顺序排列的元素集合序列是Python中最基本的数据结构。序列中的每个值都有对应的位置值,称之为索引,第一个索引是0,第二个索引是1,依......
  • 列表form搜索参数的细节
    像这样,有form的列表页。需求要加一个搜索组件,这个form的method最好用get,而不是post。因为如果用post,点了返回,会出现此网页需要使用您之前输入的数据才能正常显示。您可以重......