207 lines
5.0 KiB
JavaScript
207 lines
5.0 KiB
JavaScript
|
/**
|
||
|
* Sample React Native App
|
||
|
* https://github.com/facebook/react-native
|
||
|
*/
|
||
|
'use strict';
|
||
|
|
||
|
var React = require('react-native');
|
||
|
var {
|
||
|
AppRegistry,
|
||
|
StyleSheet,
|
||
|
Text,
|
||
|
View,
|
||
|
TouchableOpacity,
|
||
|
} = React;
|
||
|
|
||
|
var Video = require('react-native-video');
|
||
|
|
||
|
var VideoPlayer = React.createClass({
|
||
|
getInitialState() {
|
||
|
return {
|
||
|
rate: 1,
|
||
|
volume: 1,
|
||
|
muted: false,
|
||
|
resizeMode: 'contain', // cover, stretch
|
||
|
duration: 0.0,
|
||
|
currentTime: 0.0,
|
||
|
}
|
||
|
},
|
||
|
|
||
|
onLoad(data) {
|
||
|
this.setState({duration: data.duration});
|
||
|
},
|
||
|
|
||
|
onProgress(data) {
|
||
|
this.setState({currentTime: data.currentTime});
|
||
|
},
|
||
|
|
||
|
getCurrentTimePercentage() {
|
||
|
if (this.state.currentTime > 0) {
|
||
|
return parseFloat(this.state.currentTime) / parseFloat(this.state.duration);
|
||
|
} else {
|
||
|
return 0;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
renderRateControl(rate) {
|
||
|
var isSelected = (this.state.rate == rate);
|
||
|
|
||
|
return (
|
||
|
<TouchableOpacity onPress={() => { this.setState({rate: rate}) }}>
|
||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||
|
{rate}x
|
||
|
</Text>
|
||
|
</TouchableOpacity>
|
||
|
)
|
||
|
},
|
||
|
|
||
|
renderResizeModeControl(resizeMode) {
|
||
|
var isSelected = (this.state.resizeMode == resizeMode);
|
||
|
|
||
|
return (
|
||
|
<TouchableOpacity onPress={() => { this.setState({resizeMode: resizeMode}) }}>
|
||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||
|
{resizeMode}
|
||
|
</Text>
|
||
|
</TouchableOpacity>
|
||
|
)
|
||
|
},
|
||
|
|
||
|
renderVolumeControl(volume) {
|
||
|
var isSelected = (this.state.volume == volume);
|
||
|
|
||
|
return (
|
||
|
<TouchableOpacity onPress={() => { this.setState({volume: volume}) }}>
|
||
|
<Text style={[styles.controlOption, {fontWeight: isSelected ? "bold" : "normal"}]}>
|
||
|
{volume * 100}%
|
||
|
</Text>
|
||
|
</TouchableOpacity>
|
||
|
)
|
||
|
},
|
||
|
|
||
|
render() {
|
||
|
var flexCompleted = this.getCurrentTimePercentage() * 100;
|
||
|
var flexRemaining = (1 - this.getCurrentTimePercentage()) * 100;
|
||
|
|
||
|
return (
|
||
|
<View style={styles.container}>
|
||
|
<TouchableOpacity onPress={() => {this.setState({paused: !this.state.paused})}}>
|
||
|
<Video source={{uri: "broadchurch"}}
|
||
|
style={styles.video}
|
||
|
rate={this.state.rate}
|
||
|
paused={this.state.paused}
|
||
|
volume={this.state.volume}
|
||
|
muted={this.state.muted}
|
||
|
resizeMode={this.state.resizeMode}
|
||
|
onLoad={this.onLoad}
|
||
|
onProgress={this.onProgress}
|
||
|
repeat={true} />
|
||
|
</TouchableOpacity>
|
||
|
|
||
|
<View style={styles.controls}>
|
||
|
<View style={styles.generalControls}>
|
||
|
<View style={styles.rateControl}>
|
||
|
{this.renderRateControl(0.25)}
|
||
|
{this.renderRateControl(0.5)}
|
||
|
{this.renderRateControl(1.0)}
|
||
|
{this.renderRateControl(1.5)}
|
||
|
{this.renderRateControl(2.0)}
|
||
|
</View>
|
||
|
|
||
|
<View style={styles.volumeControl}>
|
||
|
{this.renderVolumeControl(0.5)}
|
||
|
{this.renderVolumeControl(1)}
|
||
|
{this.renderVolumeControl(1.5)}
|
||
|
</View>
|
||
|
|
||
|
<View style={styles.resizeModeControl}>
|
||
|
{this.renderResizeModeControl('cover')}
|
||
|
{this.renderResizeModeControl('contain')}
|
||
|
{this.renderResizeModeControl('stretch')}
|
||
|
</View>
|
||
|
</View>
|
||
|
|
||
|
<View style={styles.trackingControls}>
|
||
|
<View style={styles.progress}>
|
||
|
<View style={[styles.innerProgressCompleted, {flex: flexCompleted}]} />
|
||
|
<View style={[styles.innerProgressRemaining, {flex: flexRemaining}]} />
|
||
|
</View>
|
||
|
</View>
|
||
|
</View>
|
||
|
</View>
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
var styles = StyleSheet.create({
|
||
|
container: {
|
||
|
flex: 1,
|
||
|
justifyContent: 'center',
|
||
|
alignItems: 'center',
|
||
|
backgroundColor: 'black',
|
||
|
},
|
||
|
video: {
|
||
|
position: 'absolute',
|
||
|
top: 0,
|
||
|
left: 0,
|
||
|
bottom: 0,
|
||
|
right: 0,
|
||
|
},
|
||
|
controls: {
|
||
|
backgroundColor: "transparent",
|
||
|
borderRadius: 5,
|
||
|
position: 'absolute',
|
||
|
bottom: 20,
|
||
|
left: 20,
|
||
|
right: 20,
|
||
|
},
|
||
|
progress: {
|
||
|
flex: 1,
|
||
|
flexDirection: 'row',
|
||
|
borderRadius: 3,
|
||
|
overflow: 'hidden',
|
||
|
},
|
||
|
innerProgressCompleted: {
|
||
|
height: 20,
|
||
|
backgroundColor: '#cccccc',
|
||
|
},
|
||
|
innerProgressRemaining: {
|
||
|
height: 20,
|
||
|
backgroundColor: '#2C2C2C',
|
||
|
},
|
||
|
generalControls: {
|
||
|
flex: 1,
|
||
|
flexDirection: 'row',
|
||
|
borderRadius: 4,
|
||
|
overflow: 'hidden',
|
||
|
paddingBottom: 10,
|
||
|
},
|
||
|
rateControl: {
|
||
|
flex: 1,
|
||
|
flexDirection: 'row',
|
||
|
justifyContent: 'center',
|
||
|
},
|
||
|
volumeControl: {
|
||
|
flex: 1,
|
||
|
flexDirection: 'row',
|
||
|
justifyContent: 'center',
|
||
|
},
|
||
|
resizeModeControl: {
|
||
|
flex: 1,
|
||
|
flexDirection: 'row',
|
||
|
alignItems: 'center',
|
||
|
justifyContent: 'center',
|
||
|
},
|
||
|
controlOption: {
|
||
|
alignSelf: 'center',
|
||
|
fontSize: 11,
|
||
|
color: "white",
|
||
|
paddingLeft: 2,
|
||
|
paddingRight: 2,
|
||
|
lineHeight: 12,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
AppRegistry.registerComponent('VideoPlayer', () => VideoPlayer);
|