RN 使用react-native-video 播放视频(包含进度条、全屏)
21年12月3日,阐述上有问题:应该将问题拆分,不该将代码整一大堆,看着很不舒适
目标需求:
1. 实现视频播放
2. 进度条
3. 进入全屏
目标图是这样的:
需要三个组件
1. 播放视频组件, react-native-video 官网地址 https://www.npmjs.com/package/react-native-video#allowsexternalplayback
2. 进度条,官网上提供的 slider组件我忘记说的什么原因,即将停止支持,我找了react-native-silder 这个个第三方包 官网地址 https://github.com/react-native-community/react-native-slider#onvaluechange现在react-native-silder 的一些生命周期方法都是警告,因为react很多声明周期函数,已经废弃或改名字 ,我目前在尝试 https://github.com/callstack/react-native-slider
3. 全屏播放,react-native-orientation这个包有问题,因为RN 将对 rnpm 换一种支持策略 ,所以选择用 react-native-orientation-locker 官网地址 https://github.com/wonday/react-native-orientation-locker
后面的就直接上代码了
import React from 'react';
import {View,Text,StyleSheet,TouchableWithoutFeedback,TouchableOpacity,Dimensions} from 'react-native';
//导入Video组件
import Video from 'react-native-video';
// 导入 Silder组件
import Slider from '@react-native-community/slider';
// 屏幕方向锁定: 他需要改变 原来Android文件代码,当然适配两端的话,IOS也是需要更改的。
import Orientation from 'react-native-orientation-locker'; let screenWidth = Dimensions.get('window').width;
let screenHeight = Dimensions.get('window').height;
console.log(screenWidth+" "+screenHeight+"带有小数"); export default class App extends React.Component{
constructor(props){
super(props);
this.changePausedState = this.changePausedState.bind(this);
this.customerSliderValue = this.customerSliderValue.bind(this);
this.enterFullScreen = this.enterFullScreen.bind(this);
this._changePauseSliderFullState = this._changePauseSliderFullState.bind(this);
this._onStartShouldSetResponder = this._onStartShouldSetResponder.bind(this);
this.state = {
isPaused: true, //是暂停
duration: 0, //总时长
currentTime: 0, //当前播放时间
sliderValue: 0, //进度条的进度 //用来控制进入全屏的属性
videoWidth: screenWidth,
videoHeight: 226,
isFullScreen: false,
isVisiblePausedSliderFullScreen: false
}
}
changePausedState(){ //控制按钮显示播放,要显示进度条3秒钟,之后关闭显示
this.setState({
isPaused: this.state.isPaused?false:true,
isVisiblePausedSliderFullScreen: true
})
//这个定时调用失去了this指向
let that = this;
setTimeout(function(){
that.setState({
isVisiblePausedSliderFullScreen: false
})
},3000)
}
_changePauseSliderFullState(){ // 单击事件,是否显示 “暂停、进度条、全屏按钮 盒子”
let flag = this.state.isVisiblePausedSliderFullScreen?false:true;
this.setState({
isVisiblePausedSliderFullScreen: flag
})
//这个定时调用失去了this指向
let that = this;
setTimeout(function(){
that.setState({
isVisiblePausedSliderFullScreen: false
})
},3000)
}
//格式化音乐播放的时间为0:00。借助onProgress的定时器调用,更新当前时间
formatMediaTime(time) {
let minute = Math.floor(time / 60);
let second = parseInt(time - minute * 60);
minute = minute >= 10 ? minute : "0" + minute;
second = second >= 10 ? second : "0" + second;
return minute + ":" + second; }
//加载视频调用,主要是拿到 “总时间”,并格式化
customerOnload(e){
let time = e.duration;
this.setState({
duration: time
})
}
// 获得当前的,播放时间数,但这个数是0.104,需要处理
customerOnprogress(e){
let time = e.currentTime; // 获取播放视频的秒数
this.setState({
currentTime: time,
sliderValue: time
})
}
// 移动滑块,改变视频播放进度
customerSliderValue(value){
this.player.seek(value);
}
enterFullScreen(){ //1.改变宽高 2.允许进入全屏模式 3.如何配置屏幕旋转,不需要改变进度条盒子的显示和隐藏
this.setState({
videoWidth: screenHeight,
videoHeight: screenWidth,
isFullScreen: true
})
// 直接设置方向
Orientation.lockToLandscape();
}
_onStartShouldSetResponder(e){
console.log(e);
}
componentDidMount() {
var initial = Orientation.getInitialOrientation();
if (initial === 'PORTRAIT') {
console.log('是竖屏');
} else {
console.log('如果是横屏,就将其旋转过来');
Orientation.lockToPortrait();
}
}
render(){
// 播放按钮组件:是否显示
let playButtonComponent = (
<TouchableWithoutFeedback
onPress={this.changePausedState}
>
<View style={styles.playBtn}>
</View>
</TouchableWithoutFeedback>
);
let pausedBtn = this.state.isPaused?playButtonComponent:null;
// 暂停按钮、进度条、全屏按钮 是否显示
let pausedSliderFullComponent = (
<View style={{position:"absolute",bottom:0}}>
<View style={{flexDirection:'row',alignItems:'center'}}>
{/* 进度条按钮 */}
<View style={styles.sliderBox}>
<Text>{this.formatMediaTime(this.state.currentTime)}</Text>
<Slider
style={{width: 200, height: 40}}
value={this.state.sliderValue}
maximumValue={this.state.duration}
thumbTintColor="#000" //开关夹点的yanse
minimumTrackTintColor="red"
maximumTrackTintColor="#ccc"
step={1}
onValueChange={this.customerSliderValue}
/>
<Text>{this.formatMediaTime(this.state.duration)}</Text>
</View>
{/* 全屏按钮 */}
<View>
<TouchableOpacity
onPress={this.enterFullScreen}
>
<Text style={{backgroundColor:'#00ff00',padding:5}}>全屏</Text>
</TouchableOpacity>
</View> </View>
</View>
);
let pausedSliderFull = this.state.isVisiblePausedSliderFullScreen?pausedSliderFullComponent:null;
return (
<View>
<View>
<TouchableWithoutFeedback
onPress={this._changePauseSliderFullState}
onResponderMove={this._onStartShouldSetResponder}
>
<Video source={require('../jifen.mp4')}
ref={(ref) => {
this.player = ref
}}
style={{width: this.state.videoWidth,height: this.state.videoHeight,backgroundColor:"#FFC1C1"}}
allowsExternalPlayback={false} // 不允许导出 或 其他播放器播放
paused = {this.state.isPaused} // 控制视频是否播放
resizeMode="cover"
onLoad={(e)=>this.customerOnload(e)}
onProgress={(e)=>this.customerOnprogress(e)}
fullscreen={this.state.isFullScreen}
/>
</TouchableWithoutFeedback>
{/* 播放的按钮:点击之后需要消失 */}
{pausedBtn}
{/* 暂停按钮,进度条,全屏按钮 */}
{pausedSliderFull}
</View>
</View>
)
}
}
var styles = StyleSheet.create({
myVideo:{
width: 340,
height: 240
},
playBtn:{
width: 50,
height: 50,
backgroundColor:'red',
borderRadius: 50,
position: "absolute",
top: "50%",
left: "50%",
marginLeft: -25,
marginTop:-25,
zIndex:999
},
sliderBox:{
flex:0,
flexDirection:'row',
alignItems:'center'
}
});
看个效果图吧,这个普通播放时
这是全屏播放时
测试这个花了挺长时间的,有用点个赞吧,哈哈
RN 使用react-native-video 播放视频(包含进度条、全屏)的更多相关文章
- 【React Native开发】React Native控件之ProgressBarAndroid进度条解说(12)
),React Native技术交流4群(458982758).请不要反复加群! 欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...
- RN 实战 & React Native 实战
RN 实战 & React Native 实战 https://abc.xgqfrms.xyz/react-native-docs/ 0.59 https://github.com/xgqfr ...
- 微信浏览器video播放视频踩坑
video属性介绍 iOS的属性 playsinline On iPhone, video playsinline elements will now be allowed to play inlin ...
- video播放视频以及相关事件
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- android97 播放音频 有进度条控制
package com.itheima.musicplayer; import android.os.Bundle; import android.os.Handler; import android ...
- 03 SeekBar 音频播放拖拽进度条
八, SeekBar 音频播放拖拽进度条 > android:progress="40" 第一进度 and ...
- vlc播放器设置开机自动全屏播放网络视频流
因工作需要,要用vlc视频播放器实现开机自动全屏播放某个网络视频流.百度了下,说的都很模糊,经过整理,设置方法如下: 一,添加视频流地址:rtsp://wowzaec2demo.streamlock. ...
- HTML5 - 使用<video>播放视频
,下面是一个播放视频的最简单样例 (controls属性告诉浏览器要有基本播放控件) <video src="hangge.mp4" controls></vid ...
- 关于video标签移动端开发遇到的问题,获取视频第一帧,全屏,自动播放,自适应等问题
最近一直在处理video标签在IOS和Android端的兼容问题,其中遇到不少坑,绝大多数问题已经解决,下面是处理问题经验的总结: 1.获取视频的第一帧作为背景图: 技术:canvas绘图 windo ...
- H5 video安卓默认点击不能全屏播放解决办法
调用方法: autoFullScrenn(obj) 还有一篇: 使用MediaElement.js构建个性的HTML5音频和视频播放器 var fullscreen = function(elem) ...
随机推荐
- springboot上传图片
springboot上传图片 新建一个springboot项目: 在java/main/com/ljx 创建一个controller.fileController类 内容如下: package com ...
- JS-变量存储
1.存储(变量)JS中变量是存在栈内存中JS中的内存分两种:栈内存.堆内存 栈内存:存放变量 堆内存:存代码块(object和function) var fn=function()和function ...
- Gitbook部署之nodejs踩坑
title: Gitbook部署之nodejs踩坑 date: 2020-11-06 16:34:30 summary: Gitbook部署和NVM的使用.hexo失效 Gitbook部署之nodej ...
- Linux 第九章( 网卡配置,双网卡绑定,密钥,管理远程会话 )
/etc/hosts.allow 允许 //默认是先匹配允许在匹配拒绝 /etc/hosts.deny 拒绝 service iptables save //保存iptables配置 ...
- 广告网络归因技术之SKAdNetwork
IDFA的背景 为了保护用户隐私,早在2012年就不再允许其生态中的玩家获取用户的唯一标识符,但是商家在移动端打广告的时候又希望能监控到每一次广告投放的效果,因此,苹果想出了折中的办法,就是提供另外一 ...
- Windows10下SecureCRT、SecureFX安装与破解(超级详细)
整理了Windows10下最新版本SecureCRT9.1.SecureFX9.1安装 1.资源地址: 链接:https://pan.baidu.com/s/1XoQqpRlpBm6Tvc0fHni6 ...
- 杂:pthread_cond_timedwait导致死锁
地球人都知道1:pthread_cond_timedwait使用时,需要对[条件]加锁.[条件]也是一种线程共享资源. 地球人都知道2:1个互斥锁不应该管理2类及以上的多线程共享资源 1+2=下面这样 ...
- MAYA专用卸载工具,完全彻底卸载删除干净maya各种残留注册表和文件的方法和步骤
maya专用卸载工具,完全彻底卸载删除干净maya各种残留注册表和文件的方法和步骤.如何卸载maya呢?有很多同学想把maya卸载后重新安装,但是发现maya安装到一半就失败了或者显示maya已安装或 ...
- Nginx负载均衡4种方案
1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器. 配置的例子如下:http{ upstream sampleapp { ...
- ls access.log.?.gz
因为日志文件每天都会打包, 所以昨天的问题可能就在今天的access.log/error.log文件里找不到了.如何找出个位数的log文件呢? 这里就有两种不同的匹配符号, *匹配多个, ?匹配一个, ...