RecyclerView中播放视频
在很多播放视频的APP中都有在列表中播放视频的效果,当点击播放的时候,在列表中播放,当视频列表滑动出屏幕的时候,就在屏幕的右下角播放。大致效果如下图:
主要思路
- 在和RecyclerView的同级布局文件中,在右下角放置一个隐藏FrameLayout,当正在播放的列表滑出界面的时候,将右下角的FragmeLayout设置为显示,并将播放的SurfaceView添加到右下角的FragmeLayout播放。
- 在列表的ViewHolder布局文件中放置一个FragmeLayout,当点击播放按钮时,将SurfaceView添加到FragmentLayout中播放。
- 为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中播放视频相关推荐
- ue4蓝图节点手册中文_在UE4中播放视频
简介: 在日常使用UE4做项目时,会遇到在UE4里播放视频文件的需求,在UE4中可以使用媒体框架(Media Framework)来实现这一功能.这里介绍两种简单的方法来使用这一功能,分别是在场景里播 ...
- 在Winform中播放视频等【DotNet,C#】
在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...
- vue3中播放视频和m3u8后缀的视频解决办法
vue3中播放视频和m3u8后缀的视频解决办法 ****必须使用 vue@3.2.2及以上版本 使用 这个插件 vue3-video-play 官方地址 地址链接跳转 官方文档 文档地址 npm 安装 ...
- ckplayer支持html5播放吗,移动端(H5)环境中播放视频需要了解的内容-ckplayer使用方法...
移动端(H5)环境中播放视频需要了解的内容 虽然HTML5(下面简称:H5)的技术已整体趋于成熟,但在视频播放方面,如果跟pc端的flashplayer对比的话,功能就显的非常简单了.如果你决定要让你 ...
- android listview中播放视频,支持全屏
最近在做项目的时候有需求要在 listView 中播放视频,并且支持横竖屏无缝切换,在网上搜索了一下,关于这种 demo真的很少, 有的也只是实现简单的功能,无法满足项目中的需求,想着修改一下凑合用, ...
- 前端随笔--WEB中播放视频(JS实现)
网页中播放视频已经很常见了,网上也有很多的视频播放插件.因为工作的需要,研究了下视频的播放,但是没有使用其他视频播放的插件(修改起来比较麻烦),自己写了些代码实现了下.下面的代码是使用js实现的,通过 ...
- winform中播放视频?ffplay比MediaPlayer和暴风都好用
如何在winform程序中播放音频和视频?其实方法有不少,我们要做的就是找到一个最好的.最简单的是用系统自带的WindowsMediaPlayer组件(值得欣慰的是,Win10系统仍然可以找到,找不到 ...
- python如何播放视频_python中播放视频的方法有哪些
python中播放视频的方法有哪些 发布时间:2020-08-25 11:45:52 来源:亿速云 阅读:78 作者:小新 这篇文章给大家分享的是有关python中播放视频的方法有哪些的内容.小编觉得 ...
- 36.Silverlight中播放视频和打印文档【附带源码实例】
在silverlight实际项目中时常会需要播放视频和打印文档,在本节中我们将制作一个最简单的播放视频和打印文档的实例. 一.播放WMV视频 首先我们创建一个Silverlight应用程序SLShow ...
最新文章
- vue项目按需引入element-ui,修改.babelrc文件之后报错
- 蛋花花谈Web开发到底要不要加入人工智能
- 云原生架构应该怎么设计?
- PAT 乙级 1009
- Python——四大内置高阶函数(map、reduce、filter、sorted)
- 全平台 Chrome 浏览器 44.0.2403.89 版本下载
- 解决Windows10专业版无法安装语言包!!!
- IDEA界面SVN回滚到历史指定版本
- linux 实时显示网速,linux 实时显示网速bash
- Appdata中local是文件,系统盘下的文件目录
- Python-15 函数:我的地盘听我的
- Bootstrap4与Bootstrap3的区别
- Mysql8.0下载(网盘云盘)
- ol3中妙用Arcgis Server Rest Export接口模拟WMS,并实现属性过滤
- matlab表达式比未知数多,matlab求解未知数
- layuiadmin(iframe)+tp5开发一个小型后台内容管理系统入门
- 网易考拉涉假疑案最新进展:雅诗兰黛中国承认没有鉴定真假的仪器
- 啦啦啦!令人激动的国庆小长假快要到来啦!大家是否都有出游的打算呢?
- Js 之移动端图片上传插件mbUploadify
- Duilib学习笔记《05》— 消息响应处理