react-native-video实现视频全屏播放的方法


Posted in Javascript onMarch 19, 2018

react-native-video 是github上一个专用于React Native做视频播放的组件。这个组件是React Native上功能最全最好用的视频播放组件,还在持续开发之中,虽然还有些bug,但基本不影响使用,强力推荐。

本篇文章主要介绍下怎么使用react-native-video播放视频,以及如何实现全屏播放,屏幕旋转时视频播放器大小随之调整,显示全屏或收起全屏。

首先来看看react-native-video有哪些功能。

基本功能

  1. 控制播放速率
  2. 控制音量大小
  3. 支持静音功能
  4. 支持播放和暂停
  5. 支持后台音频播放
  6. 支持定制样式,比如设置宽高
  7. 丰富的事件调用,如onLoad,onEnd,onProgress,onBuffer等等,可以通过对应的事件进行UI上的定制处理,如onBuffer时我们可以显示一个进度条提示用户视频正在缓冲。
  8. 支持全屏播放,使用presentFullscreenPlayer方法。这个方法在iOS上可行,在android上不起作用。参看 issue#534 ,#726也是同样的问题。
  9. 支持跳转进度,使用seek方法跳转到指定的地方进行播放
  10. 可以加载远程视频地址进行播放,也可以加载RN本地存放的视频。

注意事项

react-native-video通过source属性设置视频,播放远程视频时使用uri来设置视频地址,如下:

source={{uri: http://www.xxx.com/xxx/xxx/xxx.mp4}}

播放本地视频时,使用方式如下:

source={require('../assets/video/turntable.mp4')}

需要注意的是,source属性不能为空,uri或本地资源是必须要设置的,否则会导致app闪退。uri不能设置为空字符串,必须是一个具体的地址。

安装配置

使用 npm i -S react-native-video 或 yarn add react-native-video 安装,完成之后使用 react-native link react-native-video 命令link这个库。

Android端在执行完link命令后,gradle中就已经完成了配置。iOS端还需要手动配置一下,这里简单说一下,与官方说明不同的是,我们一般不使用tvOS的,选中你自己的target,在build phases中先移除掉自动link进来的 libRCTVideo.a 这个库,然后点击下方加号重新添加 libRCTVideo.a ,注意不要选错。

react-native-video实现视频全屏播放的方法

视频播放

实现视频播放其实很简单,我们只需要给Video组件设置一下source资源,然后设置style调整Video组件宽高就行了。

<Video
 ref={(ref) => this.videoPlayer = ref}
 source={{uri: this.state.videoUrl}}
 rate={1.0}
 volume={1.0}
 muted={false}
 resizeMode={'cover'}
 playWhenInactive={false}
 playInBackground={false}
 ignoreSilentSwitch={'ignore'}
 progressUpdateInterval={250.0}
 style={{width: this.state.videoWidth, height: this.state.videoHeight}}
/>

其中videoUrl是我们用来设置视频地址的变量,videoWidth和videoHeight是用来控制视频宽高的。

全屏播放的实现

视频全屏播放其实就是在横屏情况下全屏播放,竖屏一般都是非全屏的。要实现设备横屏时视频全屏显示,说起来很简单,就是通过改变Video组件宽高来实现。

上面我们把videoWidth和videoHeight存放在state中,目的就是为了通过改变两个变量的值来刷新UI,使视频宽高能随之改变。问题是,怎样在设备的屏幕旋转时及时获取到改变后的宽高呢?

竖屏时我设置的视频初始宽度为设备屏幕的宽度,高度为宽度的9/16,即按16:9的比例显示。横屏时视频的宽度应为屏幕的宽度,高度应为当前屏幕的高度。由于横屏时设备宽高发生了变化,及时获取到宽高就能及时刷新UI,视频就能全屏展示了。

刚开始我想到的办法是使用 react-native-orientation 监听设备转屏的事件,在回调方法中判断当前是横屏还是竖屏,这个在iOS上是可行的,但是在Android上横屏和竖屏时获取到宽高值总是不匹配的(比如,横屏宽384高582,竖屏宽582高384,显然不合理),这样就无法做到统一处理。

所以,监听转屏的方案是不行的,不仅费时还得不到想要的结果。更好的方案是在render函数中使用View作为最底层容器,给它设置一个"flex:1"的样式,使其充满屏幕,在View的onLayout方法中获取它的宽高。无论屏幕怎么旋转,onLayout都可以获取到当前View的宽高和x、y坐标。

/// 屏幕旋转时宽高会发生变化,可以在onLayout的方法中做处理,比监听屏幕旋转更加及时获取宽高变化
 _onLayout = (event) => {
 //获取根View的宽高
 let {width, height} = event.nativeEvent.layout;
 console.log('通过onLayout得到的宽度:' + width);
 console.log('通过onLayout得到的高度:' + height);
 
 // 一般设备横屏下都是宽大于高,这里可以用这个来判断横竖屏
 let isLandscape = (width > height);
 if (isLandscape){
  this.setState({
  videoWidth: width,
  videoHeight: height,
  isFullScreen: true,
  })
 } else {
  this.setState({
  videoWidth: width,
  videoHeight: width * 9/16,
  isFullScreen: false,
  })
 }
 };

这样就实现了屏幕在旋转时视频也随之改变大小,横屏时全屏播放,竖屏回归正常播放。注意,Android和iOS需要配置转屏功能才能使界面自动旋转,请自行查阅相关配置方法。

播放控制

上面实现了全屏播放还不够,我们还需要一个工具栏来控制视频的播放,比如显示进度,播放暂停和全屏按钮。具体思路如下:

  1. 使用一个View将Video组件包裹起来,View的宽高和Video一致,便于转屏时改变大小
  2. 设置一个透明的遮罩层覆盖在Video组件上,点击遮罩层显示或隐藏工具栏
  3. 工具栏中要显示播放按钮、进度条、全屏按钮、当前播放时间、视频总时长。工具栏以绝对位置布局,覆盖在Video组件底部
  4. 使用react-native-orientation中的lockToPortrait和lockToLandscape方法强制旋转屏幕,使用unlockAllOrientations在屏幕旋转以后撤销转屏限制。

这样才算是一个有模有样的视频播放器。下面是竖屏和横屏的效果图

react-native-video实现视频全屏播放的方法

react-native-video实现视频全屏播放的方法

再也不必为presentFullscreenPlayer方法不起作用而烦恼了,全屏播放实现起来其实很简单。具体代码请看demo: https://github.com/mrarronz/react-native-blog-examples/tree/master/Chapter7-VideoPlayer/VideoExample 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
比较不错的JS/JQuery显示或隐藏文本的方法
Feb 13 Javascript
Js可拖拽放大的层拖动特效实现方法
Feb 25 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
AngularJS入门教程之ng-checked 指令详解
Aug 01 Javascript
JavaScript瀑布流布局实现代码
May 06 Javascript
基于zTree树形菜单的使用实例
Dec 25 Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 jQuery
vue中Axios的封装与API接口的管理详解
Aug 09 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
Sep 24 Javascript
vuex存取值和映射函数使用说明
Jul 24 Javascript
JS实现4位随机验证码
Oct 19 Javascript
vue实现树形菜单效果
Mar 19 #Javascript
VUE重点问题总结
Mar 19 #Javascript
p5.js入门教程之键盘交互
Mar 19 #Javascript
vue 实现的树形菜的实例代码
Mar 19 #Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 #Javascript
jQuery替换节点元素的操作方法
Mar 18 #jQuery
使用Angular CLI生成 Angular 5项目教程详解
Mar 18 #Javascript
You might like
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
jQuery 动画基础教程
2008/12/25 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
javascript中的new使用
2010/03/20 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
类如何去实现接口
2013/12/19 面试题
正隆泰信息技术有限公司上机题
2012/06/14 面试题
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
综合实践活动总结
2014/05/05 职场文书
2014年后勤工作总结
2014/11/18 职场文书
天河观后感
2015/06/11 职场文书
重阳节活动主持词
2015/07/04 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python