目录

  • 前言
  • react-native-orientation-locker
  • react-native-video
  • 全屏实现方案(可参考)
  • 尾言

前言

最近工作业务用到了react-native-video,还需要能够全屏,全屏需要用到锁定应用方向(横屏),需要用到组件react-native-orientation-locker,本文记录使用方法以及提供一种解决思路。

react-native-orientation-locker

横竖屏方法

我就只介绍这常用的三个,其他的可以翻看官方文档

import Orientation from 'react-native-orientation-locker';
Orientation.lockToLandscapeLeft() // 向左方向锁定横屏
Orientation.lockToLandscapeRight() // 向右方向锁定横屏
Orientation.unlockAllOrientations(); // 解除锁定
Orientation.lockToPortrait(); // 锁定竖屏

react-native-video

导入

import Video from 'react-native-video';

函数部分

  // 设置总时长setDuration({ duration }) {this.setState({ duration });}// 播放结束可将暂停变量设置为trueonEnd() {this.setState({paused: true,});}// 缓冲,loading变量可控制缓冲圈显示onBuffer({ isBuffering }) {this.setState({ loading: isBuffering });}// 设置进度条和播放时间的变化,sliderValue用来同步步进器setTime({ currentTime }) {this.setState({sliderValue: currentTime,});}// 播放暂停changePlayed() {this.setState({ paused: !this.state.paused });}

视频组件

    <View style={styles.Video}>{loading ? <View style={styles.loading}><ActivityIndicator size='large' color='lightgray' /> // 缓冲圈</View> : null}<Videoref={(ref: Video) => {this.video = ref; // 视频Video的ref}}source={{uri: 'http://xxx/xxx.mp4', //播放路径}}style={{ width: '100%', height: '100%' }}rete={1}volume={1}paused={paused} // 暂停变量onEnd={() => {this.onEnd(); // 播放结束时执行}}onBuffer={data => this.onBuffer(data)} // 缓冲时执行,用于显示缓冲圈onProgress={data => this.setTime(data)} // 播放时执行函数,用于同步步进器进度onLoad={data => this.setDuration(data)} // 播放前得到总时长,用于步进器设置总长muted={muted} // 静音/></View>

控制台

    <View style={styles.videoControl}>{/* 暂停按钮 */}<TouchableOpacityonPress={() => {this.changePlayed();}}><Image style={styles.paused} source={paused ? pausedImg : played} /></TouchableOpacity><Slidervalue={sliderValue}maximumValue={duration}// onValueChange 和 onSlidingComplete 是修改步进器进度时触发的函数// 可以在此时同步视频播放,同步视频播放的函数是,video的Ref.seek()// 中间需要设置视频暂停和播放,否则边拖动边播放会很奇怪onValueChange={(value) => {this.video.seek(value);this.setState({paused: true,});}}onSlidingComplete={(value) => {this.video.seek(value);this.setState({paused: false,});}}style={styles.slider}/>{/* 静音按钮 */}<TouchableOpacityonPress={() => {this.setState({ muted: !muted });}}><Image style={{ marginLeft: 10, height: 24, width: 24 }} source={muted ? mute : sound} /></TouchableOpacity>{/* 全屏按钮 */}<TouchableOpacityonPress={() => {// 这里涉及到react-native-orientation-locker// 可以锁定应用为横屏,这里的状态设置是我的全屏解决方案this.setState({ fullVideoShow: true, sliderValue2: sliderValue }, () => {this.setState({ paused: true });// 需要将原视频暂停});Orientation.lockToLandscapeLeft();}}><Image style={{ marginLeft: 10, height: 20, width: 20 }} source={fullScreen} /></TouchableOpacity></View>

全屏实现方案(可参考)

我采用的是弹出层方案,使用Orientation横屏时,新建一个model层覆盖全屏,然后新建一个相同的播放组件,记得将原视频组件暂停。

可以参考的点,以下表示model层上的视频组件

  // 放大时,总长已经不需要再次获取,我们可以在onLoad2时将sliderValue赋值给video2// 达到放大时同步进度的效果onLoad2(data) {this.video2.seek(this.state.sliderValue);}// 设置vedio2的同步步进器2进度时,需要注意,currentTime>0再赋值// 否则在视频加载过程中会出现步进器2跳一下0再恢复的情况setTime2({ currentTime }) {if (currentTime > 0) {this.setState({sliderValue2: currentTime,});}}// 退出全屏outFullScreen() {const { sliderValue2, paused2 } = this.state;this.setState({ fullVideoShow: false, sliderValue: sliderValue2);Orientation.lockToPortrait();// 退出时将原视频进度同步this.video.seek(sliderValue2);}// 播放暂停changePlayed2() {this.setState({ paused2: !this.state.paused2 });}// 另外全屏时,要将原视频paused暂停,可以在全屏按钮事件那里我有提到。

放大视频

    <Modalvisible={fullVideoShow}transparentanimationType='slide'><View style={styles.videoModelBack}><View style={styles.videoModel}>{loading ? <View style={styles.loading}><ActivityIndicator size='large' color='lightgray' /> //缓冲圈可复用状态</View> : null}<View style={{ flex: 1 }}><Videoref={(ref: Video) => {this.video2 = ref;}}source={{uri: 'http://xxx/xxx.mp4',}}style={{ flex: 1 }}rete={1}volume={1}paused={paused2}onEnd={() => {this.onEnd(0);}}onBuffer={data => this.onBuffer(data)}onProgress={data => this.setTime2(data)}onLoad={data => this.onLoad2(data)}muted={muted}/></View></View><View style={styles.videoBack}><TouchableOpacityonPress={() => {this.changePlayed2();}}><Image style={[styles.paused]} source={paused2 ? pausedImg : played} /></TouchableOpacity><Slidervalue={sliderValue2}maximumValue={duration}onValueChange={(value) => {this.video2.seek(value);this.setState({paused2: true,});}}onSlidingComplete={(value) => {this.video2.seek(value);this.setState({paused2: false,});}}style={styles.slider}/><TouchableOpacityonPress={() => {this.setState({ muted: !muted });}}><Image style={styles.img} source={muted ? mute : sound} /></TouchableOpacity><TouchableOpacityonPress={() => {this.outFullScreen();}}><Image source={outFullScreen} /> // 退出全屏按钮</TouchableOpacity></View></View></Modal>

尾言

样式我没有写出来,因为内容可能比较多,布局情况也不大相同,想完全复用不太现实,不过如果你耐心点理解重要的部分,相信你会有所收获。

如果觉得文章对你有帮助的话,欢迎点赞收藏哦,有什么错误或者意见建议也可以留言,感谢~

react-native 封装视频播放器(react-native-video)相关推荐

  1. html5播放器 迅雷,搜狗浏览器HTML5视频播放器插件(HTML5.Video.Player)

    一款搜狗浏览器的HTML5视频播放器插件,安装后可以使用HTML5方式播放优酷.土豆.爱奇艺.搜狐视频.迅雷离线.腾讯视频.56视频等网站的视频,避免使用adobe flash player插件,降低 ...

  2. 专业音视频播放器:Elmedia Video Player Pro mac中文版

    为大家推荐一款超级好用的苹果专用视频播放器,Elmedia Video Player Pro for Mac几乎支持所有的音视频格式,具备修改播放.流式传输.画中画.流传输视频到其他设备.彩色主题.观 ...

  3. 关于Unity视频播放器插件 AVPro Video(二)3D物体上视频播放

    1.官网下载该插件或者我分享的链接: 链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf 2.新建项目创建主要控制物体 3.创建对于视频播放在3D物体身上的材质 4 ...

  4. 05.视频播放器内核切换封装

    05.视频播放器内核切换封装 目录介绍 01.视频播放器内核封装需求 02.播放器内核架构图 03.如何兼容不同内核播放器 04.看一下ijk的内核实现类 05.看一下exo的内核实现类 06.如何创 ...

  5. video标签学习 xgplayer视频播放器分段播放mp4

    文章目录 学习链接 目标 video标签自带视频和制作的视频区别 video标签的src属性 本地视频文件 前端代码 播放效果 服务器视频文件 示例1 后端代码 前端代码 播放效果 示例2 后端代码 ...

  6. 完整视频播放器封装库

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.关于此视频封装库介绍 1.1 能够满足那些业务需求 1.2 对比同类型的库有哪些优势 2.关于使用方法说明 2. ...

  7. 完整视频播放器封装库,仿优酷

    目录介绍 1.关于此视频封装库介绍 1.1 能够满足那些业务需求 1.2 对比同类型的库有哪些优势 2.关于使用方法说明 2.1 关于gradle引用说明 2.2 添加布局 2.3 最简单的视频播放器 ...

  8. 完整视频播放器封装库 1

    目录介绍 1.关于此视频封装库介绍 1.1 能够满足那些业务需求 1.2 对比同类型的库有哪些优势 2.关于使用方法说明 2.1 关于gradle引用说明 2.2 添加布局 2.3 最简单的视频播放器 ...

  9. video.js视频播放器进度条标记的功能实现

    video.js视频播放器 的使用 video.js视频播放器 安装 引入 使用 video.js视频播放器 接到个需求,需要一个视频播放页面,并且进度条需要在某个时间点打上标记.在网上找了一下,发现 ...

最新文章

  1. s3c2410_gpio_cfgpin函数解析
  2. 图像检索:CNN对Hash组算法的颠覆
  3. CDN边缘JavaScript敏捷交付实践
  4. GitHub 标星 8w!学完这份指南后,你就可以去 Google 面试了!
  5. lastindexof方法_Java Vector lastIndexOf()方法与示例
  6. Spring Data JPA 从入门到精通~Criteria概念的简单介绍
  7. visio画图中怎么添加①
  8. SpringCloud→分布式解决方案、包含主要工具、启动流程、web发展阶段、实现配置中心
  9. Elasticsearch的javaAPI之facet,count,delete by query
  10. 全球铁矿石行业供给分析与投资可行性分析报告2022年版
  11. 微信公众号推送模板跳转小程序
  12. Win7 系统解压安装
  13. 差分编码 matlab,差分编码FSK调制解调matlab源程序.doc
  14. excel 置信区间 计算_正态分布置信区间Excel计算公式.ppt
  15. android4能用otg吗,小米4支持OTG吗?小米4手机的OTG功能怎么用?
  16. 日常问题:上传接口报错
  17. 深度、广度优先遍历算法python
  18. 基于Uniapp实现的在线投票App问卷调查
  19. antv g6多次渲染问题解决
  20. wordpress备份和还原和迁移

热门文章

  1. 随便记记~Chrome中,退格键失灵、搜狗输入法不能正常输入、点击网页变成下载html文件的解决办法
  2. Android开发:WGS-84、GCJ02坐标名词解释及坐标转换
  3. Ubuntu上安装CERN开发的ROOT软件
  4. 想做个项目练练手却不知道做啥?松哥准备了 50 个热门需求文档给大家!
  5. 点灯游戏2-15游戏解答
  6. 通达信交易dll接口协议
  7. C语言 数组的初始化 数组不初始化会怎样 数组的默认初始值
  8. H3CS10510报Invalid MAC address处理
  9. 富斯i6航模遥控器翻译
  10. flash8加as2.0制作山寨版flappy bird小游戏