import React, { Component } from "react"; import { Platform, Text, View, ImageBackground, Button, Image, TouchableOpacity, StyleSheet } from "react-native"; import { createStackNavigator, createAppContainer } from "react-navigation"; import Video from "react-native-video"; const instructions = Platform.select({ ios: "Press Cmd+R to reload,\n" + "Cmd+D or shake for dev menu", android: "Double tap R on your keyboard to reload,\n" + "Shake or press menu button for dev menu" }); type Props = {}; export default class CusVideo extends React.Component { state = { rate: 1, volume: 1, muted: false, resizeMode: "stretch", duration: 0.0, currentTime: 0.0, paused: false, wheel: false }; render() { return ( <View style={this.props.style}> <Video style={{ flex: 1 }} source={{ uri: this.props.uri }} ref={ref => { this.player = ref; }} // poster={this.props.poster} resizeMode={this.state.resizeMode} // posterResizeMode={this.state.resizeMode} rate={this.state.rate} //播放速率 paused={this.state.paused} //暂停 volume={this.state.volume} //调节音量 muted={this.state.muted} //控制音频是否静音 resizeMode={this.state.resizeMode} //缩放模式 onLoadStart={this.loadStart} // 当视频开始加载时的回调函数 onLoad={this.onLoad} //加载媒体并准备播放时调用的回调函数。 onProgress={this.onProgress} //视频播放过程中每个间隔进度单位调用的回调函数 onEnd={this.onEnd} //视频播放结束时的回调函数 onAudioBecomingNoisy={this.onAudioBecomingNoisy} //音频变得嘈杂时的回调 - 应暂停视频 onAudioFocusChanged={this.onAudioFocusChanged} //音频焦点丢失时的回调 - 如果焦点丢失则暂停 repeat={this.state.wheel} //确定在到达结尾时是否重复播放视频。 onError={this.onError} // 当视频不能加载,或出错后的回调函数 playInBackground={false} // 当app转到后台运行的时候,播放是否暂停 playWhenInactive={true} // [iOS] Video continues to play when control or notification center are shown. 仅适用于IOS /> <View style={[styles.player_controller]}> <View style={{ flex: 1, alignItems: "center" }} > {/* 暂停播放按钮 */} <TouchableOpacity //点击事件放在这个组件里才管用 style={{ justifyContent: "center", width: "100%", height: "100%" }} onPress={() => this.play()} > <Image style={[styles.player_pause_icon]} //source={require("../imgs/player_image_state_pause.png")} /> </TouchableOpacity> </View> <View style={{ flex: 3 }}> {/* //左侧当前播放时长 */} <Text style={[styles.player_time]}> {formatTime(this.state.currentTime)} </Text> </View> <View style={{ flex: 7, backgroundColor: "yellow" }} > {/* //中间进度条 */} {/* <SeekBar style={{ flex: 1, alignItems: "center", justifyContent: "center", width: "100%" }} max={this.state.duration} progress={this.state.currentTime} /> */} </View> <View style={{ flex: 3 }}> {/* //右侧总时长 */} <Text style={[styles.player_time]}> {formatTime(this.state.duration)} </Text> </View> <TouchableOpacity style={{ flex: 1 }} onPress={() => this.presentFullscreenPlayer()} > <View style={{ flex: 1 }}> {/* //放大按钮 */} <Image style={[styles.player_pause_icon]} /> </View> </TouchableOpacity> </View> </View> ); } loadStart() { // alert("loadStart"); } onLoad = data => { //获取的是秒数 this.setState({ duration: data.duration }); }; onProgress = data => { this.setState({ currentTime: data.currentTime }); }; onError() { alert("播放器异常"); } onEnd() { alert("播放结束"); } play() { if (this.state.paused) { this.start(); } else { this.pause(); } } pause() { this.setState({ paused: true }); this.player_icon_index = 1; } start() { this.setState({ paused: false }); this.player_icon_index = 0; } showToast(params) { // ToastExample.message(params); ToastExample.show(params, ToastExample.SHORT); } presentFullscreenPlayer() { // alert("点击调用全屏"); this.props.videofullScreenPlayer(); // this.player.presentFullscreenPlayer(); } refreshVideo() { this.setState({ duration: 0, currentTime: 0 }); } } const styles = StyleSheet.create({ player_controller: { flexDirection: "row", position: "absolute", width: "100%", height: 50, alignItems: "center", bottom: 0 }, player_pause_icon: { width: "100%", resizeMode: "center", height: "80%", justifyContent: "center", alignItems: "center", backgroundColor: "blue" }, player_time: { fontSize: 18, color: "white", alignItems: "center", justifyContent: "center", textAlignVertical: "center", textAlign: "center" } }); /** * 将秒转换为 分:秒 * s int 秒数 */ function formatTime(s) { //计算分钟 //算法:将秒数除以60,然后下舍入,既得到分钟数 var h; h = Math.floor(s / 60); //计算秒 //算法:取得秒%60的余数,既得到秒数 s = Math.round(s % 60); //将变量转换为字符串 h += ""; s += ""; //如果只有一位数,前面增加一个0 h = h.length == 1 ? "0" + h : h; s = s.length == 1 ? "0" + s : s; return h + ":" + s; }