在很多播放视频的APP中都有在列表中播放视频的效果,当点击播放的时候,在列表中播放,当视频列表滑动出屏幕的时候,就在屏幕的右下角播放。大致效果如下图:

  • 主要思路

    1. 在和RecyclerView的同级布局文件中,在右下角放置一个隐藏FrameLayout,当正在播放的列表滑出界面的时候,将右下角的FragmeLayout设置为显示,并将播放的SurfaceView添加到右下角的FragmeLayout播放。
    2. 在列表的ViewHolder布局文件中放置一个FragmeLayout,当点击播放按钮时,将SurfaceView添加到FragmentLayout中播放。
    3. 为RecyclerView设置addOnChildAttachStateChangeListener事件,这个监听有两个重要的方法
    /***当添加子View时回调*/
    public void onChildViewAttachedToWindow(View view);/***当移除子View时回调*/
    public void onChildViewDetachedFromWindow(View view)
    
  • 首先看下主界面布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.design.widget.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="@color/colorPrimary"app:layout_scrollFlags="scroll|enterAlways|snap" /></android.support.design.widget.AppBarLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></android.support.design.widget.CoordinatorLayout><!-- 右下角的FragmeLayout --><FrameLayoutandroid:id="@+id/video_root_fl"android:layout_width="150dp"android:layout_height="150dp"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:background="#000"android:visibility="gone" /><!--全屏播放的FragmeLayout--><FrameLayoutandroid:id="@+id/video_full_screen"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone" />
</RelativeLayout>

可以在布局文件中看到,在右下角中放置了一个隐藏的FrameLayout,当正在播放的列表滑出界面时我们会使用这个FrameLayout来放置播放视频的SurfaceView。

  • 在RecyclerView中的item布局文件中也有一个FrameLayout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/item_cardview"android:layout_width="match_parent"android:layout_height="200dp"android:layout_margin="10dp"android:background="#fff"android:elevation="8dp"android:padding="5dp"app:cardBackgroundColor="#fff"app:cardCornerRadius="5dp"><!--列表播放使用的FrameLayout--><FrameLayoutandroid:id="@+id/item_video_root_fl"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone" /><ImageViewandroid:id="@+id/item_imageview"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop" /><ImageViewandroid:id="@+id/item_image_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/ic_play_circle_outline_white_48dp" />
</android.support.v7.widget.CardView>

item中这个FrameLayout用于点击列表中播放按钮将要播放的SurfaceView添加到这个FrameLayout中

  • 为RecyclerView添加addOnChildAttachStateChangeListener监听,当正在播放的item滑出界面时会回调onChildViewDetachedFromWindow这个方法,我们在这个方法中判断如果FragmeLayout中有视频播放,将右下角的FrameLayout设置为显示,移除item布局中的SurfaceView并将其添加到右下角的FrameLayout,将记录这个item的位置,当再次将这个item滑动到界面中时,会回调onChildViewAttachedToWindow这个方法。同理再将这个右下角中的FrameLayout中的SurfaceView移除并设置为隐藏,再将SurfaceView添加到item中的FrameLayout播放。
 //为RecyclerView添加addOnChildAttachStateChangeListener监听
recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {@Overridepublic void onChildViewAttachedToWindow(View view) {if (videoPosition == -1 || videoRootViewFl.getVisibility() != View.VISIBLE) {return;}if (videoPosition == recyclerView.getChildAdapterPosition(view)) {videoPosition = -1;showVideo(view, VIDEO_PATH);}}@Overridepublic void onChildViewDetachedFromWindow(View view) {if (videoView == null || videoRootViewFl.getVisibility() == View.VISIBLE) return;View v = view.findViewById(R.id.item_video_root_fl);if (v != null) {FrameLayout fl = (FrameLayout) v;videoPosition = recyclerView.getChildAdapterPosition(view);if (fl.getChildCount() > 0) {fl.removeAllViews();int position = 0;if (videoView.isPlaying()) {position = videoView.getPosition();videoView.stop();}videoRootViewFl.setVisibility(View.VISIBLE);videoRootViewFl.removeAllViews();lastView = videoRootViewFl;videoRootViewFl.addView(videoView, new ViewGroup.LayoutParams(-1, -1));videoView.setVideoPath(VIDEO_PATH);videoView.start();videoView.seekTo(position);
//                        if (videoView.isPause()) {//                            videoView.resume();
//                        }}fl.setVisibility(View.GONE);}v = view.findViewById(R.id.item_imageview);if (v != null) {if (v.getVisibility() != View.VISIBLE) {v.setVisibility(View.VISIBLE);}}v = view.findViewById(R.id.item_image_play);if (v != null) {if (v.getVisibility() != View.VISIBLE) {v.setVisibility(View.VISIBLE);}}}});

完整代码
传送门

RecyclerView中播放视频相关推荐

  1. ue4蓝图节点手册中文_在UE4中播放视频

    简介: 在日常使用UE4做项目时,会遇到在UE4里播放视频文件的需求,在UE4中可以使用媒体框架(Media Framework)来实现这一功能.这里介绍两种简单的方法来使用这一功能,分别是在场景里播 ...

  2. 在Winform中播放视频等【DotNet,C#】

    在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...

  3. vue3中播放视频和m3u8后缀的视频解决办法

    vue3中播放视频和m3u8后缀的视频解决办法 ****必须使用 vue@3.2.2及以上版本 使用 这个插件 vue3-video-play 官方地址 地址链接跳转 官方文档 文档地址 npm 安装 ...

  4. ckplayer支持html5播放吗,移动端(H5)环境中播放视频需要了解的内容-ckplayer使用方法...

    移动端(H5)环境中播放视频需要了解的内容 虽然HTML5(下面简称:H5)的技术已整体趋于成熟,但在视频播放方面,如果跟pc端的flashplayer对比的话,功能就显的非常简单了.如果你决定要让你 ...

  5. android listview中播放视频,支持全屏

    最近在做项目的时候有需求要在 listView 中播放视频,并且支持横竖屏无缝切换,在网上搜索了一下,关于这种 demo真的很少, 有的也只是实现简单的功能,无法满足项目中的需求,想着修改一下凑合用, ...

  6. 前端随笔--WEB中播放视频(JS实现)

    网页中播放视频已经很常见了,网上也有很多的视频播放插件.因为工作的需要,研究了下视频的播放,但是没有使用其他视频播放的插件(修改起来比较麻烦),自己写了些代码实现了下.下面的代码是使用js实现的,通过 ...

  7. winform中播放视频?ffplay比MediaPlayer和暴风都好用

    如何在winform程序中播放音频和视频?其实方法有不少,我们要做的就是找到一个最好的.最简单的是用系统自带的WindowsMediaPlayer组件(值得欣慰的是,Win10系统仍然可以找到,找不到 ...

  8. python如何播放视频_python中播放视频的方法有哪些

    python中播放视频的方法有哪些 发布时间:2020-08-25 11:45:52 来源:亿速云 阅读:78 作者:小新 这篇文章给大家分享的是有关python中播放视频的方法有哪些的内容.小编觉得 ...

  9. 36.Silverlight中播放视频和打印文档【附带源码实例】

    在silverlight实际项目中时常会需要播放视频和打印文档,在本节中我们将制作一个最简单的播放视频和打印文档的实例. 一.播放WMV视频 首先我们创建一个Silverlight应用程序SLShow ...

最新文章

  1. vue项目按需引入element-ui,修改.babelrc文件之后报错
  2. 蛋花花谈Web开发到底要不要加入人工智能
  3. 云原生架构应该怎么设计?
  4. PAT 乙级 1009
  5. Python——四大内置高阶函数(map、reduce、filter、sorted)
  6. 全平台 Chrome 浏览器 44.0.2403.89 版本下载
  7. 解决Windows10专业版无法安装语言包!!!
  8. IDEA界面SVN回滚到历史指定版本
  9. linux 实时显示网速,linux 实时显示网速bash
  10. Appdata中local是文件,系统盘下的文件目录
  11. Python-15 函数:我的地盘听我的
  12. Bootstrap4与Bootstrap3的区别
  13. Mysql8.0下载(网盘云盘)
  14. ol3中妙用Arcgis Server Rest Export接口模拟WMS,并实现属性过滤
  15. matlab表达式比未知数多,matlab求解未知数
  16. layuiadmin(iframe)+tp5开发一个小型后台内容管理系统入门
  17. 网易考拉涉假疑案最新进展:雅诗兰黛中国承认没有鉴定真假的仪器
  18. 啦啦啦!令人激动的国庆小长假快要到来啦!大家是否都有出游的打算呢?
  19. Js 之移动端图片上传插件mbUploadify
  20. Duilib学习笔记《05》— 消息响应处理

热门文章

  1. Apache ECharts的缘起和发展
  2. 北航宇航学院计算机,2014年北航自动化考生倾情奉献的总结(也试用于宇航学院)...
  3. FBI也需要云计算吗?
  4. 外网访问8080以及80端口失败问题解决
  5. thinkphp5.1部署在百度云主机的注意事项
  6. CAD删除数据库对象
  7. 【中级软考】cache是什么?(高速缓冲存储器)
  8. html设置word页边距,word怎样设置页边距的两种方法
  9. VLC Media Player
  10. 【学术会议】如何rebuttal学术论文?