import React, { Component } from "react";
import {
Platform,
StyleSheet,
Text,
View,
Image,
Button,
PanResponder,
ImageBackground,
findNodeHandle,
UIManager,
DeviceEventEmitter
} from "react-native";
import BasePage from "../BasePage";
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 SeekBar extends BasePage {
constructor(props) {
super(props);
this.pressStatus = false;
this.progress = 0;
}
config = {
changeX: 0,
changeY: 0,
xDiff: 0,
yDiff: 0
};
state = {
max: 1,
view_width: 0,
icon_transform: [{ scale: 1 }],
left: 0,
top: 0,
touch_down: false
};
render() {
return (
{
this.progressBar = c;
}}
onLayout={() => {
const handle = findNodeHandle(this.progressBar);
setTimeout(() => {
UIManager.measure(handle, (x, y, width, height, pageX, pageY) => {
// console.warn(x, y, width, height, pageX, pageY);
this.setState({
view_width: width
});
this.setProgress(this.progress);
});
}, 0);
}}
>
);
}
componentWillMount() {
this._panResponder = PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
onMoveShouldSetPanResponder: (evt, gestureState) => true,
onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
onPanResponderGrant: (evt, gestureState) => {
this.pressStatus = true;
this.config.changeY = evt.nativeEvent.pageY;
this.config.changeX = evt.nativeEvent.pageX;
},
onPanResponderStart: (evt, gestureState) => {
this.pressStatus = true;
console.log("onPanResponderStart");
this.setState({
icon_transform: [{ scale: 1.5 }],
touch_down: true
});
},
onPanResponderMove: (evt, gestureState) => {
this.config.yDiff = evt.nativeEvent.pageY - this.config.changeY;
this.config.xDiff = evt.nativeEvent.pageX - this.config.changeX;
this.state.left = this.state.left + this.config.xDiff;
this.state.top = this.state.top + this.config.yDiff;
this.config.changeY = evt.nativeEvent.pageY;
this.config.changeX = evt.nativeEvent.pageX;
if (
this.state.left < 0 ||
this.state.left > this.state.view_width - 14
) {
if (this.state.left < 0) {
this.state.left = 0;
} else if (this.state.left > this.state.view_width - 14) {
this.state.left = this.state.view_width - 14;
}
this.setState({
left: this.state.left,
top: this.state.top
});
} else {
this.setState({
left: this.state.left,
top: this.state.top
});
console.log("onPanResponderMove:" + this.state.left);
}
},
onPanResponderEnd: (evt, gestureState) => {
this.pressStatus = true;
console.log("onPanResponderEnd");
},
onPanResponderTerminationRequest: (evt, gestureState) => true,
onPanResponderRelease: (evt, gestureState) => {
if (this.pressStatus) {
this.props.onPress && this.props.onPress();
this.setState({
icon_transform: [{ scale: 1 }],
touch_down: false
});
}
this.pressStatus = false;
var sss = this.state.left / (this.state.view_width - 14);
// alert(sss + "%");
this.props.touchUpCallBack(this.state.max * sss);
},
onPanResponderTerminate: (evt, gestureState) => {
// 另一个组件已经成为了新的响应者,所以当前手势将被取消。
},
onShouldBlockNativeResponder: (evt, gestureState) => {
// 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者
// 默认返回true。目前暂时只支持android。
//基于业务交互场景,如果这里使用js事件处理,会导致容器不能左右滑动。所以设置成false.
return false;
}
});
}
getTouchDown() {
return this.state.touch_down;
}
setMax(setmax) {
this.setState({
max: setmax
});
}
getMax() {
return this.state.max;
}
setProgress(progress) {
if (this.state.view_width > 0) {
this.progress = progress;
if (this.state.touch_down) {
} else {
var left_percentage;
if (this.state.max == 0) {
left_percentage = progress / 1;
} else {
left_percentage = progress / this.state.max;
}
this.setState({
left: (this.state.view_width - 14) * left_percentage,
icon_transform: [{ scale: 1 }]
});
}
}
}
}
const styles = StyleSheet.create({});
/**
(this.seekbar = view)}
max={100}
//必须带此方法,作为滑动之后抬起的回调
touchUpCallBack={this.touch_up_callback.bind(this)}
progress={this.state.curprogress}
/>
state = {
curprogress: 0,
max: 100
};
touch_up_callback(progress) {
//抬起之后,获取算出来的progress
this.setState({
curprogress: progress
});
}
setProgressIcon() {
//轮询设置值,超过max则停止
setTimeout(() => {
if (!this.seekbar.getTouchDown()) {
this.setState({
curprogress: this.state.curprogress + 1
});
}
if (this.state.curprogress >= this.state.max) {
alert("100了");
} else {
this.setProgressIcon();
}
this.seekbar.setProgress(this.state.curprogress);
}, 1000);
}
*/