@xhsreds/reds-rn-next 0.10.1-beta202511041914 → 0.10.1-beta202511051557
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/.tmp/coverage-0.json +1 -1
- package/coverage/.tmp/coverage-1.json +1 -1
- package/coverage/.tmp/coverage-10.json +1 -1
- package/coverage/.tmp/coverage-11.json +1 -1
- package/coverage/.tmp/coverage-12.json +1 -1
- package/coverage/.tmp/coverage-13.json +1 -1
- package/coverage/.tmp/coverage-14.json +1 -1
- package/coverage/.tmp/coverage-15.json +1 -1
- package/coverage/.tmp/coverage-16.json +1 -1
- package/coverage/.tmp/coverage-18.json +1 -1
- package/coverage/.tmp/coverage-19.json +1 -1
- package/coverage/.tmp/coverage-2.json +1 -1
- package/coverage/.tmp/coverage-20.json +1 -1
- package/coverage/.tmp/coverage-21.json +1 -1
- package/coverage/.tmp/coverage-22.json +1 -1
- package/coverage/.tmp/coverage-23.json +1 -1
- package/coverage/.tmp/coverage-24.json +1 -1
- package/coverage/.tmp/coverage-25.json +1 -1
- package/coverage/.tmp/coverage-27.json +1 -1
- package/coverage/.tmp/coverage-28.json +1 -1
- package/coverage/.tmp/coverage-29.json +1 -1
- package/coverage/.tmp/coverage-3.json +1 -1
- package/coverage/.tmp/coverage-32.json +1 -1
- package/coverage/.tmp/coverage-33.json +1 -1
- package/coverage/.tmp/coverage-34.json +1 -1
- package/coverage/.tmp/coverage-35.json +1 -1
- package/coverage/.tmp/coverage-4.json +1 -1
- package/coverage/.tmp/coverage-40.json +1 -1
- package/coverage/.tmp/coverage-42.json +1 -1
- package/coverage/.tmp/coverage-5.json +1 -1
- package/coverage/.tmp/coverage-7.json +1 -1
- package/coverage/.tmp/coverage-8.json +1 -1
- package/coverage/.tmp/coverage-9.json +1 -1
- package/lib/cjs/components/Slider/Slider.js +74 -34
- package/lib/cjs/components/Slider/Slider.js.map +1 -1
- package/lib/esm/components/Slider/Slider.js +76 -36
- package/lib/esm/components/Slider/Slider.js.map +1 -1
- package/lib/src/components/Slider/Slider.d.ts +1 -1
- package/lib/types/components/Slider/Slider.d.ts +1 -1
- package/package.json +2 -2
- package/src/components/Slider/Slider.tsx +103 -37
- package/src/components/Slider/demo/index.tsx +18 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as _slicedToArray, a as _objectSpread2 } from '../../_chunks/CAkwE9ZD.js';
|
|
2
|
-
import React, { useState, useRef, useEffect } from 'react';
|
|
3
|
-
import {
|
|
2
|
+
import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';
|
|
3
|
+
import { Dimensions, Animated, PanResponder, StyleSheet, View, TouchableWithoutFeedback } from 'react-native';
|
|
4
4
|
import { S as SliderDefaultProps } from '../../_chunks/BwgGhxV7.js';
|
|
5
5
|
import useMounted from '../../pvCount/useUnmountedProcess.js';
|
|
6
6
|
import '@xhs/reds-apm/src/index.native';
|
|
@@ -16,64 +16,91 @@ var Slider = function Slider(_ref) {
|
|
|
16
16
|
initalValue = _ref$initalValue === void 0 ? 0 : _ref$initalValue,
|
|
17
17
|
onValueChange = _ref.onValueChange,
|
|
18
18
|
_ref$dotStyle = _ref.dotStyle,
|
|
19
|
-
dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle
|
|
19
|
+
dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle,
|
|
20
|
+
_ref$step = _ref.step,
|
|
21
|
+
step = _ref$step === void 0 ? 1 : _ref$step;
|
|
20
22
|
useMounted("Slider");
|
|
21
|
-
var _useState = useState(
|
|
23
|
+
var _useState = useState(Dimensions.get("window").width),
|
|
22
24
|
_useState2 = _slicedToArray(_useState, 2),
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var _useState3 = useState(
|
|
25
|
+
sliderWidth = _useState2[0],
|
|
26
|
+
setSliderWidth = _useState2[1];
|
|
27
|
+
var _useState3 = useState(initalValue),
|
|
26
28
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
var _useState5 = useState(initalValue),
|
|
30
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
31
|
-
value = _useState6[0],
|
|
32
|
-
setValue = _useState6[1];
|
|
29
|
+
value = _useState4[0],
|
|
30
|
+
setValue = _useState4[1];
|
|
33
31
|
if (max < min) {
|
|
34
32
|
return;
|
|
35
33
|
}
|
|
36
34
|
if (value < min || value > max) {
|
|
37
35
|
return;
|
|
38
36
|
}
|
|
37
|
+
var getSteppedValue = useCallback(function (rawValue) {
|
|
38
|
+
var steppedValue = Math.round((rawValue - min) / step) * step + min;
|
|
39
|
+
return Math.max(min, Math.min(max, steppedValue));
|
|
40
|
+
}, [min, max, step]);
|
|
39
41
|
var animatedValue = useRef(new Animated.Value(initalValue * sliderWidth / (max - min))).current;
|
|
42
|
+
var animatedThumbValue = useRef(new Animated.Value(initalValue * sliderWidth / (max - min) > 0 ? initalValue * sliderWidth / (max - min) - 8 : initalValue * sliderWidth / (max - min))).current;
|
|
40
43
|
useEffect(function () {
|
|
41
44
|
var handleOrientationChange = function handleOrientationChange() {
|
|
42
|
-
setSliderWidth(Dimensions.get("window").width
|
|
45
|
+
setSliderWidth(Dimensions.get("window").width);
|
|
43
46
|
};
|
|
44
47
|
var subscription = Dimensions.addEventListener("change", handleOrientationChange);
|
|
45
|
-
createPanResponder();
|
|
46
48
|
return function () {
|
|
47
49
|
subscription.remove();
|
|
48
50
|
};
|
|
49
51
|
}, []);
|
|
50
|
-
var hanleValueUpdate = function
|
|
51
|
-
var
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
var hanleValueUpdate = useCallback(function (gestureState) {
|
|
53
|
+
var rawValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
|
|
54
|
+
var steppedValue = getSteppedValue(rawValue);
|
|
55
|
+
setValue(steppedValue);
|
|
56
|
+
animatedValue.setValue(steppedValue * sliderWidth / (max - min));
|
|
57
|
+
animatedThumbValue.setValue(steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min));
|
|
54
58
|
if (onValueChange) {
|
|
55
|
-
onValueChange(
|
|
59
|
+
onValueChange(steppedValue);
|
|
56
60
|
}
|
|
57
|
-
};
|
|
61
|
+
}, [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange]);
|
|
62
|
+
var handleTrackPress = useCallback(function (event) {
|
|
63
|
+
var locationX = event.nativeEvent.locationX;
|
|
64
|
+
var rawValue = locationX / sliderWidth * (max - min) + min;
|
|
65
|
+
var steppedValue = getSteppedValue(rawValue);
|
|
66
|
+
setValue(steppedValue);
|
|
67
|
+
Animated.timing(animatedValue, {
|
|
68
|
+
toValue: steppedValue * sliderWidth / (max - min),
|
|
69
|
+
duration: 200,
|
|
70
|
+
useNativeDriver: false
|
|
71
|
+
}).start();
|
|
72
|
+
Animated.timing(animatedThumbValue, {
|
|
73
|
+
toValue: steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min),
|
|
74
|
+
duration: 200,
|
|
75
|
+
useNativeDriver: false
|
|
76
|
+
}).start();
|
|
77
|
+
if (onValueChange) {
|
|
78
|
+
onValueChange(steppedValue);
|
|
79
|
+
}
|
|
80
|
+
}, [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue]);
|
|
58
81
|
var handleLayout = function handleLayout(event) {
|
|
59
82
|
setSliderWidth(event.nativeEvent.layout.width);
|
|
60
83
|
};
|
|
61
|
-
var
|
|
62
|
-
|
|
84
|
+
var panResponder = useMemo(function () {
|
|
85
|
+
return PanResponder.create({
|
|
63
86
|
onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
|
|
64
87
|
return true;
|
|
65
88
|
},
|
|
66
89
|
onMoveShouldSetPanResponder: function onMoveShouldSetPanResponder() {
|
|
67
90
|
return true;
|
|
68
91
|
},
|
|
69
|
-
onPanResponderGrant: function onPanResponderGrant() {
|
|
70
|
-
|
|
92
|
+
onPanResponderGrant: function onPanResponderGrant() {
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
onPanResponderRelease: function onPanResponderRelease() {
|
|
96
|
+
return true;
|
|
97
|
+
},
|
|
71
98
|
onPanResponderTerminate: function onPanResponderTerminate() {},
|
|
72
99
|
onPanResponderMove: function onPanResponderMove(evt, gestureState) {
|
|
73
100
|
hanleValueUpdate(gestureState);
|
|
74
101
|
}
|
|
75
|
-
})
|
|
76
|
-
};
|
|
102
|
+
});
|
|
103
|
+
}, [hanleValueUpdate]);
|
|
77
104
|
var styles2 = StyleSheet.create({
|
|
78
105
|
sliderContainer: {
|
|
79
106
|
flexDirection: "row",
|
|
@@ -81,7 +108,7 @@ var Slider = function Slider(_ref) {
|
|
|
81
108
|
justifyContent: "center"
|
|
82
109
|
},
|
|
83
110
|
trackContainer: {
|
|
84
|
-
width: "
|
|
111
|
+
width: "100%",
|
|
85
112
|
height: 4,
|
|
86
113
|
backgroundColor: "rgba(48, 48, 52, 0.20)",
|
|
87
114
|
borderRadius: 2
|
|
@@ -109,24 +136,37 @@ var Slider = function Slider(_ref) {
|
|
|
109
136
|
elevation: 2
|
|
110
137
|
}
|
|
111
138
|
});
|
|
112
|
-
return /* @__PURE__ */React.createElement(
|
|
113
|
-
|
|
139
|
+
return /* @__PURE__ */React.createElement(View, {
|
|
140
|
+
style: styles2.sliderContainer
|
|
114
141
|
}, /* @__PURE__ */React.createElement(View, {
|
|
115
|
-
style: styles2.
|
|
142
|
+
style: styles2.trackContainer,
|
|
116
143
|
onLayout: handleLayout
|
|
144
|
+
}, /* @__PURE__ */React.createElement(TouchableWithoutFeedback, {
|
|
145
|
+
onPress: handleTrackPress
|
|
117
146
|
}, /* @__PURE__ */React.createElement(View, {
|
|
118
|
-
style:
|
|
119
|
-
|
|
147
|
+
style: {
|
|
148
|
+
position: "absolute",
|
|
149
|
+
width: "100%",
|
|
150
|
+
height: 4
|
|
151
|
+
}
|
|
152
|
+
})), /* @__PURE__ */React.createElement(Animated.View, {
|
|
120
153
|
style: [styles2.coloredTrack, {
|
|
121
154
|
width: animatedValue
|
|
122
155
|
}]
|
|
123
|
-
}), /* @__PURE__ */React.createElement(Animated.View, _objectSpread2({
|
|
156
|
+
}), /* @__PURE__ */React.createElement(Animated.View, _objectSpread2(_objectSpread2({
|
|
124
157
|
style: [styles2.thumbButton, {
|
|
125
158
|
transform: [{
|
|
126
|
-
translateX:
|
|
159
|
+
translateX: animatedThumbValue
|
|
127
160
|
}]
|
|
128
161
|
}, dotStyle]
|
|
129
|
-
}, panResponder.panHandlers)
|
|
162
|
+
}, panResponder.panHandlers), {}, {
|
|
163
|
+
hitSlop: {
|
|
164
|
+
top: 20,
|
|
165
|
+
bottom: 20,
|
|
166
|
+
left: 20,
|
|
167
|
+
right: 20
|
|
168
|
+
}
|
|
169
|
+
}))));
|
|
130
170
|
};
|
|
131
171
|
Slider.defaultProps = SliderDefaultProps;
|
|
132
172
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.js","sources":["../../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport {\n View,\n TouchableWithoutFeedback,\n Animated,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n PanResponder,\n LayoutChangeEvent,\n PanResponderGestureState,\n} from \"react-native\";\n\nimport { RedsSlider, SliderDefaultProps } from \"./interface/index\";\nimport styles from \"./styles\";\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\n\nconst Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChange, dotStyle = {} }: RedsSlider) => {\n useMounted(\"Slider\");\n const [panResponder, setPanResponder] = useState(PanResponder.create({}));\n const [sliderWidth, setSliderWidth] = useState(Dimensions.get(\"window\").width * 0.8);\n const [value, setValue] = useState(initalValue);\n\n if (max < min) {\n return;\n }\n if (value < min || value > max) {\n return;\n }\n\n const thumbPosition = (value / (max - min)) * sliderWidth;\n const step = 1;\n const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;\n useEffect(() => {\n const handleOrientationChange = () => {\n setSliderWidth(Dimensions.get(\"window\").width * 0.8);\n };\n\n const subscription = Dimensions.addEventListener(\"change\", handleOrientationChange);\n createPanResponder();\n return () => {\n subscription.remove();\n //Dimensions.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n // 可以根据需要调整的滑块高度\n const hanleValueUpdate = (gestureState: PanResponderGestureState) => {\n const currentValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));\n\n setValue(currentValue);\n animatedValue.setValue((currentValue * sliderWidth) / (max - min));\n if (onValueChange) {\n onValueChange(currentValue);\n }\n };\n\n const handleLayout = (event: LayoutChangeEvent) => {\n setSliderWidth(event.nativeEvent.layout.width);\n };\n\n const createPanResponder = () => {\n setPanResponder(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {},\n onPanResponderRelease: () => {},\n onPanResponderTerminate: () => {},\n onPanResponderMove: (evt, gestureState) => {\n hanleValueUpdate(gestureState);\n },\n }),\n );\n };\n\n const styles = StyleSheet.create({\n sliderContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n trackContainer: {\n width: \"80%\",\n height: 4,\n backgroundColor: \"rgba(48, 48, 52, 0.20)\",\n borderRadius: 2,\n },\n coloredTrack: {\n height: 4,\n backgroundColor: \"#FF2442\",\n borderRadius: 2,\n },\n thumbButton: {\n width: 16,\n height: 16,\n position: \"absolute\",\n top: -8,\n borderRadius: 10,\n backgroundColor: \"#FFF\",\n shadowColor: \"rgba(0, 0, 0, 0.20)\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 1,\n shadowRadius: 4,\n //Android\n elevation: 2,\n },\n });\n\n //<View style={[styles.track, { width: sliderWidth }]}>\n //<View style={[styles.thumb, { left: thumbPosition }]} {...panResponder.panHandlers} />\n //</View>\n return (\n <TouchableWithoutFeedback onPress={(e) => {}}>\n <View style={styles.sliderContainer} onLayout={handleLayout}>\n <View style={styles.trackContainer}>\n <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />\n <Animated.View\n style={[styles.thumbButton, { transform: [{ translateX: animatedValue }] }, dotStyle]}\n {...panResponder.panHandlers}\n />\n </View>\n </View>\n </TouchableWithoutFeedback>\n );\n};\n\nSlider.defaultProps = SliderDefaultProps;\nexport default Slider;\n"],"names":["Slider","_ref","defaultValue","_ref$min","min","_ref$max","max","_ref$initalValue","initalValue","onValueChange","_ref$dotStyle","dotStyle","useMounted","_useState","useState","PanResponder","create","_useState2","_slicedToArray","panResponder","setPanResponder","_useState3","Dimensions","get","width","_useState4","sliderWidth","setSliderWidth","_useState5","_useState6","value","setValue","animatedValue","useRef","Animated","Value","current","useEffect","handleOrientationChange","subscription","addEventListener","createPanResponder","remove","hanleValueUpdate","gestureState","currentValue","Math","dx","handleLayout","event","nativeEvent","layout","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderGrant","onPanResponderRelease","onPanResponderTerminate","onPanResponderMove","evt","styles","StyleSheet","sliderContainer","flexDirection","alignItems","justifyContent","trackContainer","height","backgroundColor","borderRadius","coloredTrack","thumbButton","position","top","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","React","createElement","TouchableWithoutFeedback","onPress","e","View","style","onLayout","_objectSpread","transform","translateX","panHandlers","defaultProps","SliderDefaultProps"],"mappings":";;;;;;;;AAiBA,IAAMA,MAAS,GAAA,SAATA,MAASA,CAAAC,IAAA,EAAqG;AAAA,EAAlGA,IAAA,CAAAC,YAAA,CAAA;QAAAC,QAAA,GAAAF,IAAA,CAAcG;AAAAA,IAAAA,mBAAM,KAAA,CAAA,GAAA,CAAG,GAAAD,QAAA,CAAA;IAAAE,QAAA,GAAAJ,IAAA,CAAAK,GAAA,CAAA;AAAAA,IAAAA,GAAA,GAAAD,QAAA,KAAM,KAAA,CAAA,GAAA,GAAK,GAAAA,QAAA,CAAA;IAAAE,gBAAA,GAAAN,IAAA,CAAAO,WAAA,CAAA;AAAAA,IAAAA,WAAA,GAAAD,gBAAA,KAAc,KAAA,CAAA,GAAA,CAAG,GAAAA,gBAAA,CAAA;IAAAE,aAAA,GAAAR,IAAA,CAAAQ,aAAA,CAAA;IAAAC,aAAA,GAAAT,IAAA,CAAeU,QAAW,CAAA;AAAXA,IAAAA,QAAW,GAAAD,aAAA,KAAA,KAAA,CAAA,GAAA;EAC7FE,UAAA,CAAW,QAAQ,CAAA,CAAA;EACb,IAAAC,SAAA,GAAkCC,SAASC,YAAa,CAAAC,MAAA,CAAO,EAAE,CAAC,CAAA;IAAAC,UAAA,GAAAC,cAAA,CAAAL,SAAA,EAAA,CAAA,CAAA;AAAjEM,IAAAA;AAAcC,IAAAA,eAAe,GAAAH,UAAA,CAAA,CAAA,CAAA,CAAA;AAC9B,EAAA,IAAAI,UAAA,GAAgCP,QAAA,CAASQ,WAAWC,GAAI,CAAA,QAAQ,CAAE,CAAAC,KAAA,GAAQ,GAAG,CAAA;IAAAC,UAAA,GAAAP,cAAA,CAAAG,UAAA,EAAA,CAAA,CAAA;AAA5EK,IAAAA,WAAa,GAAAD,UAAA,CAAA,CAAA,CAAA;AAAAE,IAAAA,cAAc,GAAAF,UAAA,CAAA,CAAA,CAAA,CAAA;AAClC,EAAA,IAAAG,UAAA,GAA0Bd,SAASN,WAAW,CAAA;IAAAqB,UAAA,GAAAX,cAAA,CAAAU,UAAA,EAAA,CAAA,CAAA;AAAvCE,IAAAA,KAAA,GAAAD,UAAA,CAAA,CAAA,CAAA;AAAOE,IAAAA,QAAQ,GAAAF,UAAA,CAAA,CAAA,CAAA,CAAA;EAEtB,IAAIvB,MAAMF,GAAK,EAAA;AACb,IAAA,OAAA;AACF,GAAA;AACI,EAAA,IAAA0B,KAAA,GAAQ1B,GAAO,IAAA0B,KAAA,GAAQxB,GAAK,EAAA;AAC9B,IAAA,OAAA;AACF,GAAA;EAIM,IAAA0B,aAAA,GAAgBC,MAAO,CAAA,IAAIC,QAAS,CAAAC,KAAA,CAAO3B,cAAckB,WAAgB,IAAApB,GAAA,GAAMF,GAAI,CAAA,CAAC,CAAE,CAAAgC,OAAA,CAAA;AAC5FC,EAAAA,SAAA,CAAU,YAAM;AACd,IAAA,IAAMC,0BAA0B,SAA1BA,0BAAgC;MACpCX,cAAA,CAAeL,UAAW,CAAAC,GAAA,CAAI,QAAQ,CAAA,CAAEC,QAAQ,GAAG,CAAA,CAAA;KACrD,CAAA;IAEA,IAAMe,YAAe,GAAAjB,UAAA,CAAWkB,gBAAiB,CAAA,QAAA,EAAUF,uBAAuB,CAAA,CAAA;AAC/DG,IAAAA,kBAAA,EAAA,CAAA;AACnB,IAAA,OAAO,YAAM;MACXF,YAAA,CAAaG,MAAO,EAAA,CAAA;KAEtB,CAAA;GACF,EAAG,EAAE,CAAA,CAAA;AAGC,EAAA,IAAAC,gBAAA,GAAmB,SAAnBA,gBAAAA,CAAoBC,YAA2C,EAAA;IACnE,IAAMC,YAAe,GAAAC,IAAA,CAAKxC,GAAI,CAAAF,GAAA,EAAK0C,IAAK,CAAA1C,GAAA,CAAIE,GAAM,EAAAsC,YAAA,CAAaG,EAAK,GAAArB,WAAA,IAAgBpB,GAAM,GAAAF,GAAA,CAAA,GAAOI,WAAW,CAAC,CAAA,CAAA;IAE7GuB,QAAA,CAASc,YAAY,CAAA,CAAA;IACrBb,aAAA,CAAcD,QAAU,CAAAc,YAAA,GAAenB,WAAgB,IAAApB,GAAA,GAAMF,GAAI,CAAA,CAAA,CAAA;AACjE,IAAA,IAAIK,aAAe,EAAA;MACjBA,aAAA,CAAcoC,YAAY,CAAA,CAAA;AAC5B,KAAA;GACF,CAAA;AAEM,EAAA,IAAAG,YAAA,GAAe,SAAfA,YAAAA,CAAgBC,KAA6B,EAAA;IAClCtB,cAAA,CAAAsB,KAAA,CAAMC,WAAY,CAAAC,MAAA,CAAO3B,KAAK,CAAA,CAAA;GAC/C,CAAA;AAEA,EAAA,IAAMiB,qBAAqB,SAArBA,qBAA2B;AAC/BrB,IAAAA,eAAA,CACEL,aAAaC,MAAO,CAAA;MAClBoC,8BAA8B,SAA9BA;eAAoC,IAAA,CAAA;AAAA,OAAA;MACpCC,6BAA6B,SAA7BA;eAAmC,IAAA,CAAA;AAAA,OAAA;AACnCC,MAAAA,qBAAqB,SAArBA,sBAA2B,EAAC;AAC5BC,MAAAA,uBAAuB,SAAvBA,wBAA6B,EAAC;AAC9BC,MAAAA,yBAAyB,SAAzBA,0BAA+B,EAAC;AAChCC,MAAAA,kBAAA,EAAoB,SAApBA,kBAAAA,CAAqBC,GAAA,EAAKd,YAAiB,EAAA;QACzCD,gBAAA,CAAiBC,YAAY,CAAA,CAAA;AAC/B,OAAA;AACF,KAAC,CACH,CAAA,CAAA;GACF,CAAA;AAEMe,EAAAA,IAAAA,OAAAA,GAASC,WAAW5C,MAAO,CAAA;AAC/B6C,IAAAA,eAAiB,EAAA;AACfC,MAAAA,aAAe,EAAA,KAAA;AACfC,MAAAA,UAAY,EAAA,QAAA;AACZC,MAAAA,cAAgB,EAAA,QAAA;KAClB;AACAC,IAAAA,cAAgB,EAAA;AACdzC,MAAAA,KAAO,EAAA,KAAA;AACP0C,MAAAA,MAAQ,EAAA,CAAA;AACRC,MAAAA,eAAiB,EAAA,wBAAA;AACjBC,MAAAA,YAAc,EAAA,CAAA;KAChB;AACAC,IAAAA,YAAc,EAAA;AACZH,MAAAA,MAAQ,EAAA,CAAA;AACRC,MAAAA,eAAiB,EAAA,SAAA;AACjBC,MAAAA,YAAc,EAAA,CAAA;KAChB;AACAE,IAAAA,WAAa,EAAA;AACX9C,MAAAA,KAAO,EAAA,EAAA;AACP0C,MAAAA,MAAQ,EAAA,EAAA;AACRK,MAAAA,QAAU,EAAA,UAAA;MACVC,GAAK,EAAA,CAAA,CAAA;AACLJ,MAAAA,YAAc,EAAA,EAAA;AACdD,MAAAA,eAAiB,EAAA,MAAA;AACjBM,MAAAA,WAAa,EAAA,qBAAA;AACbC,MAAAA,YAAc,EAAA;AAAElD,QAAAA,KAAO,EAAA,CAAA;AAAG0C,QAAAA,QAAQ,CAAA;OAAE;AACpCS,MAAAA,aAAe,EAAA,CAAA;AACfC,MAAAA,YAAc,EAAA,CAAA;AAAA;AAEdC,MAAAA,SAAW,EAAA,CAAA;AACb,KAAA;AACF,GAAC,CAAA,CAAA;AAKD,EAAA,sBACGC,KAAA,CAAAC,aAAA,CAAAC,wBAAA,EAAA;AAAyBC,IAAAA,OAAS,EAAA,SAATA,OAASA,CAACC,CAAM,EAAA,EAAC;AAAA,GAAA,iBACxCJ,KAAA,CAAAC,aAAA,CAAAI,IAAA,EAAA;IAAKC,KAAOzB,EAAAA,OAAAA,CAAOE,eAAiB;AAAAwB,IAAAA,QAAA,EAAUrC,YAAAA;AAC7C,GAAA,iBAAA8B,KAAA,CAAAC,aAAA,CAACI,IAAK,EAAA;IAAAC,KAAA,EAAOzB,OAAO,CAAAM,cAAAA;GAAA,qCACjB/B,QAAS,CAAAiD,IAAA,EAAT;AAAcC,IAAAA,KAAA,EAAO,CAACzB,OAAAA,CAAOU,YAAc,EAAA;AAAE7C,MAAAA,KAAO,EAAAQ,aAAAA;KAAe,CAAA;GAAG,CACvE,iBAAA8C,KAAA,CAAAC,aAAA,CAAC7C,QAAS,CAAAiD,IAAA,EAAAG,cAAA,CAAA;AACRF,IAAAA,KAAO,EAAA,CAACzB,OAAO,CAAAW,WAAA,EAAa;AAAEiB,MAAAA,SAAA,EAAW,CAAC;AAAEC,QAAAA,UAAY,EAAAxD,aAAAA;OAAe,CAAA;AAAE,OAAGrB,QAAQ,CAAA;AAAA,GAAA,EAChFQ,YAAa,CAAAsE,WAAA,CACnB,CACF,CACF,CACF,CAAA,CAAA;AAEJ,EAAA;AAEAzF,MAAA,CAAO0F,YAAe,GAAAC,kBAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"Slider.js","sources":["../../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport {\n View,\n TouchableWithoutFeedback,\n Animated,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n PanResponder,\n LayoutChangeEvent,\n PanResponderGestureState,\n} from \"react-native\";\n\nimport { RedsSlider, SliderDefaultProps } from \"./interface/index\";\nimport styles from \"./styles\";\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\n\nconst Slider = ({\n defaultValue,\n min = 0,\n max = 100,\n initalValue = 0,\n onValueChange,\n dotStyle = {},\n step = 1,\n}: RedsSlider) => {\n useMounted(\"Slider\");\n const [sliderWidth, setSliderWidth] = useState(Dimensions.get(\"window\").width);\n const [value, setValue] = useState(initalValue);\n\n if (max < min) {\n return;\n }\n if (value < min || value > max) {\n return;\n }\n\n // 添加一个函数来计算最接近的step值\n const getSteppedValue = useCallback(\n (rawValue: number) => {\n const steppedValue = Math.round((rawValue - min) / step) * step + min;\n return Math.max(min, Math.min(max, steppedValue));\n },\n [min, max, step],\n );\n\n const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;\n\n const animatedThumbValue = useRef(\n new Animated.Value(\n (initalValue * sliderWidth) / (max - min) > 0\n ? (initalValue * sliderWidth) / (max - min) - 8\n : (initalValue * sliderWidth) / (max - min),\n ),\n ).current;\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setSliderWidth(Dimensions.get(\"window\").width);\n };\n\n const subscription = Dimensions.addEventListener(\"change\", handleOrientationChange);\n return () => {\n subscription.remove();\n };\n }, []);\n\n // 可以根据需要调整的滑块高度\n const hanleValueUpdate = useCallback(\n (gestureState: PanResponderGestureState) => {\n // 计算原始值\n const rawValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));\n // 根据step计算实际值\n const steppedValue = getSteppedValue(rawValue);\n\n setValue(steppedValue);\n animatedValue.setValue((steppedValue * sliderWidth) / (max - min));\n animatedThumbValue.setValue(\n (steppedValue * sliderWidth) / (max - min) > 0\n ? (steppedValue * sliderWidth) / (max - min) - 8\n : (steppedValue * sliderWidth) / (max - min),\n );\n\n if (onValueChange) {\n onValueChange(steppedValue);\n }\n },\n [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange],\n );\n\n // 添加点击轨道跳转功能(可选)\n const handleTrackPress = useCallback(\n (event: GestureResponderEvent) => {\n const { locationX } = event.nativeEvent;\n const rawValue = (locationX / sliderWidth) * (max - min) + min;\n const steppedValue = getSteppedValue(rawValue);\n\n setValue(steppedValue);\n\n // 使用动画过渡到新位置\n Animated.timing(animatedValue, {\n toValue: (steppedValue * sliderWidth) / (max - min),\n duration: 200,\n useNativeDriver: false,\n }).start();\n\n Animated.timing(animatedThumbValue, {\n toValue:\n (steppedValue * sliderWidth) / (max - min) > 0\n ? (steppedValue * sliderWidth) / (max - min) - 8\n : (steppedValue * sliderWidth) / (max - min),\n duration: 200,\n useNativeDriver: false,\n }).start();\n\n if (onValueChange) {\n onValueChange(steppedValue);\n }\n },\n [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue],\n );\n\n const handleLayout = (event: LayoutChangeEvent) => {\n setSliderWidth(event.nativeEvent.layout.width);\n };\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => true,\n onPanResponderRelease: () => true,\n onPanResponderTerminate: () => {},\n onPanResponderMove: (evt, gestureState) => {\n hanleValueUpdate(gestureState);\n },\n }),\n [hanleValueUpdate],\n );\n\n const styles = StyleSheet.create({\n sliderContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n trackContainer: {\n width: \"100%\",\n height: 4,\n backgroundColor: \"rgba(48, 48, 52, 0.20)\",\n borderRadius: 2,\n },\n coloredTrack: {\n height: 4,\n backgroundColor: \"#FF2442\",\n borderRadius: 2,\n },\n thumbButton: {\n width: 16,\n height: 16,\n position: \"absolute\",\n top: -8,\n borderRadius: 10,\n backgroundColor: \"#FFF\",\n shadowColor: \"rgba(0, 0, 0, 0.20)\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 1,\n shadowRadius: 4,\n //Android\n elevation: 2,\n },\n });\n\n return (\n <View style={styles.sliderContainer}>\n <View style={styles.trackContainer} onLayout={handleLayout}>\n {/* 添加可点击的轨道 */}\n <TouchableWithoutFeedback onPress={handleTrackPress}>\n <View style={{ position: \"absolute\", width: \"100%\", height: 4 }} />\n </TouchableWithoutFeedback>\n\n <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />\n <Animated.View\n style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}\n {...panResponder.panHandlers}\n hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}\n />\n </View>\n </View>\n );\n};\n\nSlider.defaultProps = SliderDefaultProps;\nexport default Slider;\n"],"names":["Slider","_ref","defaultValue","_ref$min","min","_ref$max","max","_ref$initalValue","initalValue","onValueChange","_ref$dotStyle","dotStyle","_ref$step","step","useMounted","_useState","useState","Dimensions","get","width","_useState2","_slicedToArray","sliderWidth","setSliderWidth","_useState3","_useState4","value","setValue","getSteppedValue","useCallback","rawValue","steppedValue","Math","round","animatedValue","useRef","Animated","Value","current","animatedThumbValue","useEffect","handleOrientationChange","subscription","addEventListener","remove","hanleValueUpdate","gestureState","dx","handleTrackPress","event","locationX","nativeEvent","timing","toValue","duration","useNativeDriver","start","handleLayout","layout","panResponder","useMemo","PanResponder","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderGrant","onPanResponderRelease","onPanResponderTerminate","onPanResponderMove","evt","styles","StyleSheet","sliderContainer","flexDirection","alignItems","justifyContent","trackContainer","height","backgroundColor","borderRadius","coloredTrack","thumbButton","position","top","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","View","style","React","createElement","onLayout","TouchableWithoutFeedback","onPress","_objectSpread","transform","translateX","panHandlers","hitSlop","bottom","left","right","defaultProps","SliderDefaultProps"],"mappings":";;;;;;;;AAiBA,IAAMA,SAAS,SAATA,aAQY;AAAA,EAPhBC,IAAA,CAAAC,YAAA,CAAA;QAAAC,QAAA,GAAAF,IAAA,CACAG,GAAM,CAAA;AAANA,IAAAA,GAAM,GAAAD,QAAA,KAAA,KAAA,CAAA,GAAA,CAAA,GAAAA,QAAA,CAAA;IAAAE,QAAA,GAAAJ,IAAA,CACNK,GAAM,CAAA;AAANA,IAAAA,GAAM,GAAAD,QAAA,KAAA,KAAA,CAAA,GAAA,GAAA,GAAAA,QAAA,CAAA;IAAAE,gBAAA,GAAAN,IAAA,CACNO,WAAc,CAAA;AAAdA,IAAAA,WAAc,GAAAD,gBAAA,KAAA,KAAA,CAAA,GAAA,CAAA,GAAAA,gBAAA,CAAA;IACdE,aAAA,GAAAR,IAAA,CAAAQ,aAAA,CAAA;IAAAC,aAAA,GAAAT,IAAA,CACAU;AAAAA,IAAAA,sCAAW,EAAC,GAAAD,aAAA,CAAA;IAAAE,SAAA,GAAAX,IAAA,CACZY,IAAO,CAAA;AAAPA,IAAAA,IAAO,GAAAD,SAAA,KAAA,KAAA,CAAA,GAAA,CAAA,GAAAA,UAAA;EAEPE,UAAA,CAAW,QAAQ,CAAA,CAAA;AACb,EAAA,IAAAC,SAAA,GAAgCC,SAASC,UAAW,CAAAC,GAAA,CAAI,QAAQ,CAAA,CAAEC,KAAK,CAAA;IAAAC,UAAA,GAAAC,cAAA,CAAAN,SAAA,EAAA,CAAA,CAAA;AAAtEO,IAAAA;AAAaC,IAAAA,cAAc,GAAAH,UAAA,CAAA,CAAA,CAAA,CAAA;AAClC,EAAA,IAAAI,UAAA,GAA0BR,SAASR,WAAW,CAAA;IAAAiB,UAAA,GAAAJ,cAAA,CAAAG,UAAA,EAAA,CAAA,CAAA;AAAvCE,IAAAA,KAAA,GAAAD,UAAA,CAAA,CAAA,CAAA;AAAOE,IAAAA,QAAQ,GAAAF,UAAA,CAAA,CAAA,CAAA,CAAA;EAEtB,IAAInB,MAAMF,GAAK,EAAA;AACb,IAAA,OAAA;AACF,GAAA;AACI,EAAA,IAAAsB,KAAA,GAAQtB,GAAO,IAAAsB,KAAA,GAAQpB,GAAK,EAAA;AAC9B,IAAA,OAAA;AACF,GAAA;AAGA,EAAA,IAAMsB,eAAkB,GAAAC,WAAA,CACtB,UAACC,QAAqB,EAAA;AACpB,IAAA,IAAMC,eAAeC,IAAK,CAAAC,KAAA,CAAA,CAAOH,WAAW1B,GAAO,IAAAS,IAAI,IAAIA,IAAO,GAAAT,GAAA,CAAA;AAClE,IAAA,OAAO4B,KAAK1B,GAAI,CAAAF,GAAA,EAAK4B,KAAK5B,GAAI,CAAAE,GAAA,EAAKyB,YAAY,CAAC,CAAA,CAAA;GAClD,EACA,CAAC3B,GAAK,EAAAE,GAAA,EAAKO,IAAI,CACjB,CAAA,CAAA;EAEM,IAAAqB,aAAA,GAAgBC,MAAO,CAAA,IAAIC,QAAS,CAAAC,KAAA,CAAO7B,cAAcc,WAAgB,IAAAhB,GAAA,GAAMF,GAAI,CAAA,CAAC,CAAE,CAAAkC,OAAA,CAAA;AAE5F,EAAA,IAAMC,kBAAqB,GAAAJ,MAAA,CACzB,IAAIC,QAAS,CAAAC,KAAA,CACV7B,WAAc,GAAAc,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAAA,GAAO,CACvC,GAAAI,WAAA,GAAcc,WAAgB,IAAAhB,GAAA,GAAMF,GAAO,CAAA,GAAA,CAAA,GAC3CI,WAAc,GAAAc,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAC3C,CACF,CAAE,CAAAkC,OAAA,CAAA;AAEFE,EAAAA,SAAA,CAAU,YAAM;AACd,IAAA,IAAMC,0BAA0B,SAA1BA,0BAAgC;MACpClB,cAAA,CAAeN,UAAW,CAAAC,GAAA,CAAI,QAAQ,CAAA,CAAEC,KAAK,CAAA,CAAA;KAC/C,CAAA;IAEA,IAAMuB,YAAe,GAAAzB,UAAA,CAAW0B,gBAAiB,CAAA,QAAA,EAAUF,uBAAuB,CAAA,CAAA;AAClF,IAAA,OAAO,YAAM;MACXC,YAAA,CAAaE,MAAO,EAAA,CAAA;KACtB,CAAA;GACF,EAAG,EAAE,CAAA,CAAA;AAGL,EAAA,IAAMC,gBAAmB,GAAAhB,WAAA,CACvB,UAACiB,YAA2C,EAAA;IAE1C,IAAMhB,QAAW,GAAAE,IAAA,CAAK1B,GAAI,CAAAF,GAAA,EAAK4B,IAAK,CAAA5B,GAAA,CAAIE,GAAM,EAAAwC,YAAA,CAAaC,EAAK,GAAAzB,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAAA,GAAOI,WAAW,CAAC,CAAA,CAAA;AAEnG,IAAA,IAAAuB,YAAA,GAAeH,gBAAgBE,QAAQ,CAAA,CAAA;IAE7CH,QAAA,CAASI,YAAY,CAAA,CAAA;IACrBG,aAAA,CAAcP,QAAU,CAAAI,YAAA,GAAeT,WAAgB,IAAAhB,GAAA,GAAMF,GAAI,CAAA,CAAA,CAAA;AAC9CmC,IAAAA,kBAAA,CAAAZ,QAAA,CAChBI,YAAe,GAAAT,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAAA,GAAO,CACxC,GAAA2B,YAAA,GAAeT,WAAgB,IAAAhB,GAAA,GAAMF,GAAO,CAAA,GAAA,CAAA,GAC5C2B,YAAe,GAAAT,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAC5C,CAAA,CAAA;AAEA,IAAA,IAAIK,aAAe,EAAA;MACjBA,aAAA,CAAcsB,YAAY,CAAA,CAAA;AAC5B,KAAA;AACF,GAAA,EACA,CAAC3B,GAAK,EAAAE,GAAA,EAAKgB,aAAad,WAAa,EAAAK,IAAA,EAAMe,iBAAiBnB,aAAa,CAC3E,CAAA,CAAA;AAGA,EAAA,IAAMuC,gBAAmB,GAAAnB,WAAA,CACvB,UAACoB,KAAiC,EAAA;AAC1B,IAAA,IAAEC,SAAU,GAAID,KAAM,CAAAE,WAAA,CAApBD,SAAU,CAAA;IAClB,IAAMpB,QAAY,GAAAoB,SAAA,GAAY5B,WAAgB,IAAAhB,GAAA,GAAMF,GAAO,CAAA,GAAAA,GAAA,CAAA;AACrD,IAAA,IAAA2B,YAAA,GAAeH,gBAAgBE,QAAQ,CAAA,CAAA;IAE7CH,QAAA,CAASI,YAAY,CAAA,CAAA;AAGrBK,IAAAA,QAAA,CAASgB,OAAOlB,aAAe,EAAA;MAC7BmB,OAAA,EAAUtB,YAAe,GAAAT,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAAA;AAC/CkD,MAAAA,QAAU,EAAA,GAAA;AACVC,MAAAA,eAAiB,EAAA,KAAA;AACnB,KAAC,EAAEC,KAAM,EAAA,CAAA;AAETpB,IAAAA,QAAA,CAASgB,OAAOb,kBAAoB,EAAA;AAClCc,MAAAA,OACG,EAAAtB,YAAA,GAAeT,WAAgB,IAAAhB,GAAA,GAAMF,GAAO,CAAA,GAAA,CAAA,GACxC2B,YAAe,GAAAT,WAAA,IAAgBhB,GAAM,GAAAF,GAAA,CAAA,GAAO,CAC5C,GAAA2B,YAAA,GAAeT,eAAgBhB,GAAM,GAAAF,GAAA,CAAA;AAC5CkD,MAAAA,QAAU,EAAA,GAAA;AACVC,MAAAA,eAAiB,EAAA,KAAA;AACnB,KAAC,EAAEC,KAAM,EAAA,CAAA;AAET,IAAA,IAAI/C,aAAe,EAAA;MACjBA,aAAA,CAAcsB,YAAY,CAAA,CAAA;AAC5B,KAAA;AACF,GAAA,EACA,CAACT,WAAa,EAAAlB,GAAA,EAAKE,KAAKsB,eAAiB,EAAAnB,aAAA,EAAeyB,eAAeK,kBAAkB,CAC3F,CAAA,CAAA;AAEM,EAAA,IAAAkB,YAAA,GAAe,SAAfA,YAAAA,CAAgBR,KAA6B,EAAA;IAClC1B,cAAA,CAAA0B,KAAA,CAAME,WAAY,CAAAO,MAAA,CAAOvC,KAAK,CAAA,CAAA;GAC/C,CAAA;EAEA,IAAMwC,YAAe,GAAAC,OAAA,CACnB,YAAA;IAAA,OACEC,aAAaC,MAAO,CAAA;MAClBC,8BAA8B,SAA9BA;eAAoC,IAAA,CAAA;AAAA,OAAA;MACpCC,6BAA6B,SAA7BA;eAAmC,IAAA,CAAA;AAAA,OAAA;MACnCC,qBAAqB,SAArBA;eAA2B,IAAA,CAAA;AAAA,OAAA;MAC3BC,uBAAuB,SAAvBA;eAA6B,IAAA,CAAA;AAAA,OAAA;AAC7BC,MAAAA,yBAAyB,SAAzBA,0BAA+B,EAAC;AAChCC,MAAAA,kBAAA,EAAoB,SAApBA,kBAAAA,CAAqBC,GAAA,EAAKvB,YAAiB,EAAA;QACzCD,gBAAA,CAAiBC,YAAY,CAAA,CAAA;AAC/B,OAAA;AACF,KAAC,CAAA,CAAA;GACH,EAAA,CAACD,gBAAgB,CACnB,CAAA,CAAA;AAEMyB,EAAAA,IAAAA,OAAAA,GAASC,WAAWT,MAAO,CAAA;AAC/BU,IAAAA,eAAiB,EAAA;AACfC,MAAAA,aAAe,EAAA,KAAA;AACfC,MAAAA,UAAY,EAAA,QAAA;AACZC,MAAAA,cAAgB,EAAA,QAAA;KAClB;AACAC,IAAAA,cAAgB,EAAA;AACdzD,MAAAA,KAAO,EAAA,MAAA;AACP0D,MAAAA,MAAQ,EAAA,CAAA;AACRC,MAAAA,eAAiB,EAAA,wBAAA;AACjBC,MAAAA,YAAc,EAAA,CAAA;KAChB;AACAC,IAAAA,YAAc,EAAA;AACZH,MAAAA,MAAQ,EAAA,CAAA;AACRC,MAAAA,eAAiB,EAAA,SAAA;AACjBC,MAAAA,YAAc,EAAA,CAAA;KAChB;AACAE,IAAAA,WAAa,EAAA;AACX9D,MAAAA,KAAO,EAAA,EAAA;AACP0D,MAAAA,MAAQ,EAAA,EAAA;AACRK,MAAAA,QAAU,EAAA,UAAA;MACVC,GAAK,EAAA,CAAA,CAAA;AACLJ,MAAAA,YAAc,EAAA,EAAA;AACdD,MAAAA,eAAiB,EAAA,MAAA;AACjBM,MAAAA,WAAa,EAAA,qBAAA;AACbC,MAAAA,YAAc,EAAA;AAAElE,QAAAA,KAAO,EAAA,CAAA;AAAG0D,QAAAA,QAAQ,CAAA;OAAE;AACpCS,MAAAA,aAAe,EAAA,CAAA;AACfC,MAAAA,YAAc,EAAA,CAAA;AAAA;AAEdC,MAAAA,SAAW,EAAA,CAAA;AACb,KAAA;AACF,GAAC,CAAA,CAAA;AAED,EAAA,0CACGC,IAAK,EAAA;IAAAC,KAAA,EAAOpB,QAAOE,eAAAA;AAClB,GAAA,iBAAAmB,KAAA,CAAAC,aAAA,CAACH;IAAKC,KAAOpB,EAAAA,OAAAA,CAAOM;AAAgBiB,IAAAA,QAAU,EAAApC,YAAAA;AAAA,GAAA,qCAE3CqC,wBAAyB,EAAA;AAAAC,IAAAA,OAAA,EAAS/C,gBAAAA;oBAChC2C,KAAA,CAAAC,aAAA,CAAAH,IAAA,EAAA;AAAKC,IAAAA,OAAO;AAAER,MAAAA,QAAA,EAAU,UAAY;AAAA/D,MAAAA,KAAA,EAAO;AAAQ0D,MAAAA,MAAQ,EAAA,CAAA;AAAE,KAAA;GAAG,CACnE,CAAA,qCAECzC,QAAS,CAAAqD,IAAA,EAAT;AAAcC,IAAAA,KAAO,EAAA,CAACpB,QAAOU,YAAc,EAAA;AAAE7D,MAAAA,OAAOe,aAAAA;KAAe,CAAA;GAAG,CACvE,iBAAAyD,KAAA,CAAAC,aAAA,CAACxD,QAAS,CAAAqD,IAAA,EAAAO,cAAA,CAAAA,cAAA,CAAA;AACRN,IAAAA,KAAO,EAAA,CAACpB,OAAO,CAAAW,WAAA,EAAa;AAAEgB,MAAAA,SAAA,EAAW,CAAC;AAAEC,QAAAA,UAAY,EAAA3D,kBAAAA;OAAoB,CAAA;AAAE,OAAG5B,QAAQ,CAAA;GACrFgD,EAAAA,YAAa,CAAAwC,WAAA,CAAA,EAAA,EAAA,EAAA;AACjBC,IAAAA,OAAA,EAAS;AAAEjB,MAAAA,GAAK,EAAA,EAAA;AAAIkB,MAAAA,QAAQ,EAAI;AAAAC,MAAAA,IAAA,EAAM,EAAI;AAAAC,MAAAA,KAAA,EAAO,EAAA;AAAG,KAAA;GACtD,CAAA,CACF,CACF,CAAA,CAAA;AAEJ,EAAA;AAEAvG,MAAA,CAAOwG,YAAe,GAAAC,kBAAA;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { RedsSlider } from "./interface/index";
|
|
3
3
|
declare const Slider: {
|
|
4
|
-
({ defaultValue, min, max, initalValue, onValueChange, dotStyle }: RedsSlider): React.JSX.Element;
|
|
4
|
+
({ defaultValue, min, max, initalValue, onValueChange, dotStyle, step, }: RedsSlider): React.JSX.Element;
|
|
5
5
|
defaultProps: {
|
|
6
6
|
value: number;
|
|
7
7
|
min: number;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { RedsSlider } from "./interface/index";
|
|
3
3
|
declare const Slider: {
|
|
4
|
-
({ defaultValue, min, max, initalValue, onValueChange, dotStyle }: RedsSlider): React.JSX.Element | undefined;
|
|
4
|
+
({ defaultValue, min, max, initalValue, onValueChange, dotStyle, step, }: RedsSlider): React.JSX.Element | undefined;
|
|
5
5
|
defaultProps: {
|
|
6
6
|
value: number;
|
|
7
7
|
min: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xhsreds/reds-rn-next",
|
|
3
|
-
"version": "0.10.1-
|
|
3
|
+
"version": "0.10.1-beta202511051557",
|
|
4
4
|
"author": "贾斌(呀哈) <jiabin@xiaohongshu.com>",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"dependencies": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"react-native-fs": "2.20.0",
|
|
27
27
|
"react-native-svg": "13.14.0",
|
|
28
28
|
"@xhs/react-native-harmony": "*",
|
|
29
|
-
"@xhsreds/reds-token-next": "0.10.1-
|
|
29
|
+
"@xhsreds/reds-token-next": "0.10.1-beta202511051557"
|
|
30
30
|
},
|
|
31
31
|
"peerDependenciesMeta": {
|
|
32
32
|
"ozone-schema-web": {
|
|
@@ -15,10 +15,17 @@ import { RedsSlider, SliderDefaultProps } from "./interface/index";
|
|
|
15
15
|
import styles from "./styles";
|
|
16
16
|
import useMounted from "../../pvCount/useUnmountedProcess";
|
|
17
17
|
|
|
18
|
-
const Slider = ({
|
|
18
|
+
const Slider = ({
|
|
19
|
+
defaultValue,
|
|
20
|
+
min = 0,
|
|
21
|
+
max = 100,
|
|
22
|
+
initalValue = 0,
|
|
23
|
+
onValueChange,
|
|
24
|
+
dotStyle = {},
|
|
25
|
+
step = 1,
|
|
26
|
+
}: RedsSlider) => {
|
|
19
27
|
useMounted("Slider");
|
|
20
|
-
const [
|
|
21
|
-
const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width * 0.8);
|
|
28
|
+
const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width);
|
|
22
29
|
const [value, setValue] = useState(initalValue);
|
|
23
30
|
|
|
24
31
|
if (max < min) {
|
|
@@ -28,51 +35,109 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
|
|
|
28
35
|
return;
|
|
29
36
|
}
|
|
30
37
|
|
|
31
|
-
|
|
32
|
-
const
|
|
38
|
+
// 添加一个函数来计算最接近的step值
|
|
39
|
+
const getSteppedValue = useCallback(
|
|
40
|
+
(rawValue: number) => {
|
|
41
|
+
const steppedValue = Math.round((rawValue - min) / step) * step + min;
|
|
42
|
+
return Math.max(min, Math.min(max, steppedValue));
|
|
43
|
+
},
|
|
44
|
+
[min, max, step],
|
|
45
|
+
);
|
|
46
|
+
|
|
33
47
|
const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;
|
|
48
|
+
|
|
49
|
+
const animatedThumbValue = useRef(
|
|
50
|
+
new Animated.Value(
|
|
51
|
+
(initalValue * sliderWidth) / (max - min) > 0
|
|
52
|
+
? (initalValue * sliderWidth) / (max - min) - 8
|
|
53
|
+
: (initalValue * sliderWidth) / (max - min),
|
|
54
|
+
),
|
|
55
|
+
).current;
|
|
56
|
+
|
|
34
57
|
useEffect(() => {
|
|
35
58
|
const handleOrientationChange = () => {
|
|
36
|
-
setSliderWidth(Dimensions.get("window").width
|
|
59
|
+
setSliderWidth(Dimensions.get("window").width);
|
|
37
60
|
};
|
|
38
61
|
|
|
39
62
|
const subscription = Dimensions.addEventListener("change", handleOrientationChange);
|
|
40
|
-
createPanResponder();
|
|
41
63
|
return () => {
|
|
42
64
|
subscription.remove();
|
|
43
|
-
//Dimensions.removeEventListener("change", handleOrientationChange);
|
|
44
65
|
};
|
|
45
66
|
}, []);
|
|
46
67
|
|
|
47
68
|
// 可以根据需要调整的滑块高度
|
|
48
|
-
const hanleValueUpdate = (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
69
|
+
const hanleValueUpdate = useCallback(
|
|
70
|
+
(gestureState: PanResponderGestureState) => {
|
|
71
|
+
// 计算原始值
|
|
72
|
+
const rawValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
|
|
73
|
+
// 根据step计算实际值
|
|
74
|
+
const steppedValue = getSteppedValue(rawValue);
|
|
75
|
+
|
|
76
|
+
setValue(steppedValue);
|
|
77
|
+
animatedValue.setValue((steppedValue * sliderWidth) / (max - min));
|
|
78
|
+
animatedThumbValue.setValue(
|
|
79
|
+
(steppedValue * sliderWidth) / (max - min) > 0
|
|
80
|
+
? (steppedValue * sliderWidth) / (max - min) - 8
|
|
81
|
+
: (steppedValue * sliderWidth) / (max - min),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
if (onValueChange) {
|
|
85
|
+
onValueChange(steppedValue);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
[min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange],
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// 添加点击轨道跳转功能(可选)
|
|
92
|
+
const handleTrackPress = useCallback(
|
|
93
|
+
(event: GestureResponderEvent) => {
|
|
94
|
+
const { locationX } = event.nativeEvent;
|
|
95
|
+
const rawValue = (locationX / sliderWidth) * (max - min) + min;
|
|
96
|
+
const steppedValue = getSteppedValue(rawValue);
|
|
97
|
+
|
|
98
|
+
setValue(steppedValue);
|
|
99
|
+
|
|
100
|
+
// 使用动画过渡到新位置
|
|
101
|
+
Animated.timing(animatedValue, {
|
|
102
|
+
toValue: (steppedValue * sliderWidth) / (max - min),
|
|
103
|
+
duration: 200,
|
|
104
|
+
useNativeDriver: false,
|
|
105
|
+
}).start();
|
|
106
|
+
|
|
107
|
+
Animated.timing(animatedThumbValue, {
|
|
108
|
+
toValue:
|
|
109
|
+
(steppedValue * sliderWidth) / (max - min) > 0
|
|
110
|
+
? (steppedValue * sliderWidth) / (max - min) - 8
|
|
111
|
+
: (steppedValue * sliderWidth) / (max - min),
|
|
112
|
+
duration: 200,
|
|
113
|
+
useNativeDriver: false,
|
|
114
|
+
}).start();
|
|
115
|
+
|
|
116
|
+
if (onValueChange) {
|
|
117
|
+
onValueChange(steppedValue);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
[sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue],
|
|
121
|
+
);
|
|
57
122
|
|
|
58
123
|
const handleLayout = (event: LayoutChangeEvent) => {
|
|
59
124
|
setSliderWidth(event.nativeEvent.layout.width);
|
|
60
125
|
};
|
|
61
126
|
|
|
62
|
-
const
|
|
63
|
-
|
|
127
|
+
const panResponder = useMemo(
|
|
128
|
+
() =>
|
|
64
129
|
PanResponder.create({
|
|
65
130
|
onStartShouldSetPanResponder: () => true,
|
|
66
131
|
onMoveShouldSetPanResponder: () => true,
|
|
67
|
-
onPanResponderGrant: () =>
|
|
68
|
-
onPanResponderRelease: () =>
|
|
132
|
+
onPanResponderGrant: () => true,
|
|
133
|
+
onPanResponderRelease: () => true,
|
|
69
134
|
onPanResponderTerminate: () => {},
|
|
70
135
|
onPanResponderMove: (evt, gestureState) => {
|
|
71
136
|
hanleValueUpdate(gestureState);
|
|
72
137
|
},
|
|
73
138
|
}),
|
|
74
|
-
|
|
75
|
-
|
|
139
|
+
[hanleValueUpdate],
|
|
140
|
+
);
|
|
76
141
|
|
|
77
142
|
const styles = StyleSheet.create({
|
|
78
143
|
sliderContainer: {
|
|
@@ -81,7 +146,7 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
|
|
|
81
146
|
justifyContent: "center",
|
|
82
147
|
},
|
|
83
148
|
trackContainer: {
|
|
84
|
-
width: "
|
|
149
|
+
width: "100%",
|
|
85
150
|
height: 4,
|
|
86
151
|
backgroundColor: "rgba(48, 48, 52, 0.20)",
|
|
87
152
|
borderRadius: 2,
|
|
@@ -107,21 +172,22 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
|
|
|
107
172
|
},
|
|
108
173
|
});
|
|
109
174
|
|
|
110
|
-
//<View style={[styles.track, { width: sliderWidth }]}>
|
|
111
|
-
//<View style={[styles.thumb, { left: thumbPosition }]} {...panResponder.panHandlers} />
|
|
112
|
-
//</View>
|
|
113
175
|
return (
|
|
114
|
-
<
|
|
115
|
-
<View style={styles.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
<
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
176
|
+
<View style={styles.sliderContainer}>
|
|
177
|
+
<View style={styles.trackContainer} onLayout={handleLayout}>
|
|
178
|
+
{/* 添加可点击的轨道 */}
|
|
179
|
+
<TouchableWithoutFeedback onPress={handleTrackPress}>
|
|
180
|
+
<View style={{ position: "absolute", width: "100%", height: 4 }} />
|
|
181
|
+
</TouchableWithoutFeedback>
|
|
182
|
+
|
|
183
|
+
<Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
|
|
184
|
+
<Animated.View
|
|
185
|
+
style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}
|
|
186
|
+
{...panResponder.panHandlers}
|
|
187
|
+
hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
|
|
188
|
+
/>
|
|
123
189
|
</View>
|
|
124
|
-
</
|
|
190
|
+
</View>
|
|
125
191
|
);
|
|
126
192
|
};
|
|
127
193
|
|
|
@@ -8,6 +8,7 @@ const styles = StyleSheet.create({
|
|
|
8
8
|
justifyContent: "center",
|
|
9
9
|
paddingTop: 100,
|
|
10
10
|
paddingBottom: 100,
|
|
11
|
+
paddingHorizontal: 50,
|
|
11
12
|
},
|
|
12
13
|
scrollView: {
|
|
13
14
|
backgroundColor: "pink",
|
|
@@ -44,6 +45,23 @@ export default function App() {
|
|
|
44
45
|
<Br />
|
|
45
46
|
<Slider min={200} max={100}></Slider>
|
|
46
47
|
<Br />
|
|
48
|
+
<Desc>step使用示例</Desc>
|
|
49
|
+
<Slider
|
|
50
|
+
min={0}
|
|
51
|
+
max={100}
|
|
52
|
+
step={10} // 每次移动10个单位
|
|
53
|
+
initalValue={0}
|
|
54
|
+
onValueChange={(value: any) => console.log("Current value:", value)}
|
|
55
|
+
/>
|
|
56
|
+
<Br />
|
|
57
|
+
<Desc>step使用示例(或者更小的步长)</Desc>
|
|
58
|
+
<Slider
|
|
59
|
+
min={0}
|
|
60
|
+
max={1}
|
|
61
|
+
step={0.1} // 每次移动0.1个单位
|
|
62
|
+
initalValue={0.5}
|
|
63
|
+
onValueChange={(value: any) => console.log("Current value:", value)}
|
|
64
|
+
/>
|
|
47
65
|
</View>
|
|
48
66
|
);
|
|
49
67
|
}
|