首先上效果圖, 由于沒(méi)有好用的gif圖錄制工具掺逼, 就發(fā)兩張圖湊合看吧趋艘, 大家有什么好用的gif錄制 推薦給我一下
初始值
改變后
代碼復(fù)制直接就可以使用
import React, { Component } from 'react'
import { StyleSheet, View, PanResponder, Text, Dimensions } from 'react-native'
const roundSize = 30 // 圓的大小
const width = Dimensions.get('window').width // 設(shè)備寬度
export default class App extends Component {
constructor(props) {
super(props)
this.state = {
start: 0, // 起始坐標(biāo)
end: width - roundSize, // 結(jié)束坐標(biāo)
range: 1000, // 最大價(jià)格
endPrice: '不限', // 結(jié)束價(jià)格
startPrice: 0 // 起始價(jià)格
}
}
componentWillMount() {
this.panResponderStart = PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
onMoveShouldSetPanResponder: (evt, gestureState) => true,
onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
onPanResponderTerminationRequest: (evt, gestureState) => true,
onPanResponderGrant: (evt, gestureState) => {
this.forceUpdate()
},
onPanResponderMove: (evt, gestureState) => { // 開(kāi)始的拖動(dòng)事件
let { end, range } = this.state
let start = gestureState.moveX // 當(dāng)前拖動(dòng)所在的坐標(biāo)
if (start < 10) { // 到起始閥值,置為0
start = 0
}
if (end < start) { // 保證開(kāi)始價(jià)格不會(huì)超過(guò)結(jié)束價(jià)格
start = end - roundSize
}
if(start > width) { // 保證開(kāi)始價(jià)格不會(huì)超過(guò)最大值
start = width
}
let startPrice = Math.floor(start / width * range) // 計(jì)算開(kāi)始價(jià)格顯示值
if (start === 0) {
startPrice = 0
}
this.setState({
start,
startPrice
})
},
onPanResponderRelease: (evt, gestureState) => true,
onPanResponderTerminate: (evt, gestureState) => true,
})
this.panResponderEnd = PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
onMoveShouldSetPanResponder: (evt, gestureState) => true,
onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
onPanResponderTerminationRequest: (evt, gestureState) => true,
onPanResponderGrant: (evt, gestureState) => {
this.forceUpdate()
},
onPanResponderMove: (evt, gestureState) => { // 結(jié)束的拖動(dòng)事件
let { start, range } = this.state
let end = gestureState.moveX
if (end < start) {
end = start + 30
}
if(end > width - roundSize) {
end = width - roundSize
}
let endPrice = Math.floor(end / (width - roundSize) * range) > range - 1 ? '不限' : Math.floor(end / (width - roundSize) * range)
this.setState({
end,
endPrice
})
},
onPanResponderRelease: (evt, gestureState) => true,
onPanResponderTerminate: (evt, gestureState) => true,
})
}
render() {
let { start, end, range, startPrice, endPrice } = this.state
return (
<View style={styles.container}>
<View style={[{ position: 'absolute' }, { left: start }, { top: -3 }]}><Text>¥{startPrice}</Text></View>
<View style={[{ position: 'absolute' }, { left: end }, { top: -3 }]}><Text>{endPrice !== '不限' ? `¥${endPrice}` : endPrice}</Text></View>
<View style={{ flexDirection: 'row' }}>
<View style={[styles.progressContainer, { backgroundColor: '#eee' }, { width: start }]}></View>
<View style={[styles.progressContainer, { width: width - start - (width - end) }]}></View>
<View style={[styles.progressContainer, { backgroundColor: '#eee' }, { width: width - end }]}></View>
</View>
<View style={[styles.circle, { left: start }]} {...this.panResponderStart.panHandlers}>
</View>
<View style={[styles.circle, { left: end }]} {...this.panResponderEnd.panHandlers}>
</View>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
marginTop: 200,
height: 70,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#fff',
},
progressContainer: {
backgroundColor: '#105eae',
height: 4
},
circle: {
position: 'absolute',
width: roundSize,
height: roundSize,
borderRadius: roundSize / 2,
borderColor: '#eee',
shadowColor: 'rgba(0,0,0,0.6)',
shadowRadius: 5,
shadowOpacity: 0.9,
backgroundColor: '#ccc',
}
})
代碼寫的不咋滴描融, 不過(guò)能用????