Я создаю музыкальный проигрыватель и сосредотачиваюсь на индикаторе выполнения. Я мог реагировать на жесты смахивания, но не могу ограничить, насколько далеко заходит этот жест.
Это то, что я делал до сих пор. Я свел все к минимуму:
constructor(props) {
super(props);
this.state = {
pan: new Animated.ValueXY()
};
}
componentWillMount() {
this._panResponder = PanResponder.create({
onMoveShouldSetResponderCapture: () => true,
onMoveShouldSetPanResponderCapture: () => true,
onPanResponderGrant: (e, gestureState) => {
// Set the initial value to the current state
let x = (this.state.pan.x._value < 0) ? 0 : this.state.pan.x._value;
this.state.pan.setOffset({ x, y: 0 });
this.state.pan.setValue({ x: 0, y: 0 });
},
onPanResponderMove: Animated.event([
null, { dx: this.state.pan.x, dy: 0 },
]),
onPanResponderRelease: (e, { vx, vy }) => {
this.state.pan.flattenOffset();
}
});
}
render() {
let { pan } = this.state;
// Calculate the x and y transform from the pan value
let [translateX, translateY] = [pan.x, pan.y];
// Calculate the transform property and set it as a value for our style which we add below to the Animated.View component
let imageStyle = { transform: [{ translateX }, { translateY }] };
return (
<View style={styles.container}>
<Animated.View style={{imageStyle}} {...this._panResponder.panHandlers} />
</View>
);
}
Вот изображение, показывающее, в чем проблема.
Исходное положение:
Неверная позиция, превышен лимит:
Таким образом, идея состоит в том, чтобы прекратить движение после достижения предела (как влево, так и вправо). Я попытался проверить, _value < 0
, но это не сработало, так как это похоже на смещение, а не на позицию.
Любая помощь будет оценена по достоинству.