最近公司出了新的需求, 想让视频列表滑到哪里,哪里就自动播放.

于是乎,深海开始动手了:

第一步,先让视频可以手动点击播放

这个简单:就往ViewHolder里放一个视频播放器就可以了

播放器我用的这个第三方:https://blog.csdn.net/qq_39731011/article/details/90672491

着重说一下,因为播放器框架问题以及性能相关问题,播放完一个视频,播放下一个视频的时候要初始化播放器

让整个列表,始终只有一个播放器在播放视频.

重点代码: MediaPlayerManager.instance().releaseMediaPlayer();   初始化播放器

/**作者:赵星海*时间:2019/7/30 16:31*用途: ViewHolder中,播放器点击事件*/
mVideoView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mVideoView == null) return;if (isPlay) {isPlay = false;MediaPlayerManager.instance().pause(); // 停止播放mVideoView.setVisibility(View.GONE);play.setVisibility(View.VISIBLE);} else {if (getPosition()!=Attention_Adapter.startPosition){MediaPlayerManager.instance().releaseMediaPlayer();}isPlay = true;MediaPlayerManager.instance().start();mVideoView.setVisibility(View.VISIBLE);play.setVisibility(View.GONE);}}});

我知道看这个代码你会有几点疑惑,我依次解释一下其用途,

然后你也可采用类似方式实现,毕竟可能你我用的播放器不同,或者业务逻辑不同

isPlay: →  boolean类型,这是一个是否正在播放的标记,因为要让播放器只运行一个,所以提成了全局

MediaPlayerManager;  →  这是我用的播放器的控制器类,负责暂停,初始化等功能

play.setVisibility(View.GONE) →  一个盖在播放器上面的一个小浮标,无需深究

第二步,让视频自动播放

实现RecyclerView的滑动监听:

/**作者:赵星海*时间:2019/7/30 15:35*用途: RecyclerView滑动监听_确定自动播放的位置和回收点*/mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {private int thisPosition = -1;@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);switch (newState) {case RecyclerView.SCROLL_STATE_IDLE: //滚动停止LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();if (layoutManager != null) {int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();int lastVisibleItem = layoutManager.findLastVisibleItemPosition();int eddVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();if (eddVisibleItem == thisPosition) return;thisPosition = eddVisibleItem;int thisVideoView = eddVisibleItem - firstVisibleItem;if (layoutManager != null && layoutManager.getChildAt(thisVideoView) != null&& layoutManager.getChildAt(thisVideoView).findViewById(R.id.attention_holder_video) != null) {VideoView videoView = layoutManager.getChildAt(thisVideoView).findViewById(R.id.attention_holder_video);videoView.start();LogUtils.loge("开始播放新视频");}}break;case RecyclerView.SCROLL_STATE_DRAGGING: //手指拖动break;case RecyclerView.SCROLL_STATE_SETTLING: //惯性滚动break;}}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);}});

这里要注意,在监听里的匿名内部类中定义了一个变量:

private int thisPosition = -1;       //代表当前屏幕中完整显示的Item

初次尝试:通过获取屏幕中显示的第一个Item和最后一个Item来确定thisPosition:

两个核心方法:

                    int firstPosition = layoutManager.findFirstVisibleItemPosition();int lastPosition = layoutManager.findLastVisibleItemPosition();

核心思想: (深海又要开始画图了...)

上图是当初深海取当前位置thisPosition的方案.

代码体现是这样的:

                if (lastPosition-firstPosition ==1){thisPosition = firstPosition;}else if(lastPosition-firstPosition >1){thisPosition = firstPosition+1;}

最后的左边减去最开始的坐标,获取到屏幕中显示Item的数量,然后通过这个来确定thisPosition的取值方法:

但是最终这个方案被废弃了,在实际的使用中遇到很多问题,比如遇到两个条目过大的时候 第一个条目仅仅滑上去一点点,也会直接

播放下面只露头的Item.....

后来,我去翻了一下layoutManager的源码. 当!当!当!当~!  我发现了这个方法 findLastCompletelyVisibleItemPosition()

这个方法可以直接获取当前屏幕中完整显示的Item,返回最下面的Item.

因为 layoutManager.getChildAt(thisVideoView) 方法参数是该条目在当前页的相对坐标,而不是所有控件的坐标

所以,用当前的坐标findLastCompletelyVisibleItemPosition(),减去第一个Item的坐标firstVisibleItem,就得到了当前完整显示的Item的相对坐标.

然后就可以用相对坐标作为 layoutManager.getChildAt(thisVideoView)的参数获取到当前完整显示的最后一个item的VideoVIew控件去控制播放 , 完毕!

如果大家还有什么不懂的地方,或者有更好的建议,欢迎大家评论区留言! 看到必回! 谢谢!

Android 视频列表(RecyclerView)实现自动播放相关推荐

  1. Android 基于GSYVideoPlayer实现短视频软件上下滑自动播放视频

    先放效果图 两个视频的地址: private final String mp4_a = "http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212 ...

  2. 怎么让优酷视频在网页中自动播放方法

    优酷视频在网页中自动播放: 方法一 1.首先在优酷复制得到欲贴视频的代码, <embed src="http://player.youku.com/player.php/sid/XMz ...

  3. android 6.0开机后自动播放U盘视频

    前段时间客户提出了一个小需求.需要实现开机后插入U盘,自动播放U盘里面的视频.为了完成这个需求,是这样处理的,APP开机启动,创建服务,监听U盘的插入.我们有两个问题需要处理,第一是APP需要开机启动 ...

  4. 视屏播放_使用原生MediaPlayer+TextureView实现全屏、小窗口、视频列表、m3u8监控播放

    Android 视屏播放器----MediaPlayer+TextureView实现全屏.小窗口.视频列表播放 标签(空格分隔): 视屏播放器 一.效果图 二.集成步骤 按文件目录复制进自己项目[文件 ...

  5. 开机自动播放视频,开机就自动播放视频,开机自动播放u盘视频

    因客户要求,开机自动播放视频,不需要电脑控制,通电自动循环播放视频. 电脑成本太高,最少也要800元,个头太大,解码也不是太好,控制不太方便, 于是就给客户推荐了一个'企鹅安卓机顶盒',个头小,解码速 ...

  6. 阻止YouTube视频在Firefox中自动播放

    It drives me crazy that YouTube videos start playing automatically. It's especially annoying when yo ...

  7. 自动点击器如何设置最快_微视APP如何设置自动播放视频-微视APP设置自动播放视频的方法...

    微视APP是一款功能实用的短视频软件,在手机上安装这款软件之后就可以在使用手机的时候点击打开微视,查看一些自己感兴趣的视频,现在很多视频应用都是采用滑动的方式来进行切换视频,如果用户的手不方便进行滑动 ...

  8. 网页引用优酷视频并添加封面自动播放

    引用优酷视频可以减轻公司的服务器压力,而且和自己上传保存视频相比会方便轻松许多,不过相对的需要忍受广告. 首先你需要在优酷里找到你要引用的视频,或者自己上传.然后打开会有一个分享按钮: 以我使用的第二 ...

  9. 通过howler.js实现在Android下的微信浏览器自动播放音频

    howler.js是一个把webaudio进行封装的一个js库,通过它可以轻松的对音频文件进行控制播放.暂停.甚至指定播放音频中的某个片段.以及加快等等,这里我们只关注它在微信浏览器中自动播放的问题, ...

最新文章

  1. 7-28 猴子选大王 (C语言)
  2. PLSQL重点问题理解和实战
  3. GetResponse() 基础连接已经关闭:服务器关闭了本应保持活动状态的连接
  4. Spring4.X系列之Spring JDBC
  5. CentOS7: How to resolve curl#56 - Recv failure: Connection reset by peer
  6. TI-89T 教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣
  7. Uncaught SyntaxError: Unexpected identifier ”的报错解决
  8. 使用poi读写Excel
  9. 系统学习机器学习之弱监督学习(三)--Adversarial Autoencoders
  10. Android twrp+adb 完美免费救砖 安装系统教程 亲测有效
  11. 时代变迁,台湾的这个优势产业即将被中国大陆取代
  12. 用计算机进行绘画教案,第二课 用鼠标键盘创作作品--电脑绘画教学设计(教案)...
  13. redis中数据倾斜问题的产生和解决方案
  14. js获取对象的方法,根据id、根据name、根据标签名、根据类名
  15. 工作十二年后,开始学习人生第十四种编程语言
  16. 利用random随机生成汉字名字
  17. 集成友盟的意见反馈功能
  18. 《投资要义》书中的精髓:成功投资的要义在于低估值买入、分散化投资以及不深度研究个股。
  19. [Warning] Using a password on the command line interface can be insecure.
  20. 豆瓣FM加心音乐批量下载

热门文章

  1. android模拟器打印模拟器分辨率,调节BlueStacks模拟器分辨率,体验最佳视觉
  2. 编写一个函数,由实参传来一个字符串, 统计此字符串中字母、数字、空格和其他字符的个数,并输出结果。
  3. iOS extracts: The Illusion of Motion
  4. 420集的python教程下载_微软官方发布了最新420集Python教程,这教程简直就是编程界福利...
  5. Mac上使用Royal TSX链接服务器
  6. win7 64bit下硬盘内容显示该文件夹为空,但是显示有7G的占用,解释
  7. JSP高校学生积分管理系统myeclipse开发mysql数据库bs框架java编程jdbc详细设计
  8. 怎么把真人照片转漫画?快来收下这一招
  9. idea中actiBPM插件生成png文件 ,右键xml文件没有Diagrams
  10. 热词挖掘、热度值计算方法及python实现