@xhsreds/reds-rn-next 0.10.1-beta202511051512 → 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.
Files changed (46) hide show
  1. package/coverage/.tmp/coverage-0.json +1 -1
  2. package/coverage/.tmp/coverage-1.json +1 -1
  3. package/coverage/.tmp/coverage-10.json +1 -1
  4. package/coverage/.tmp/coverage-11.json +1 -1
  5. package/coverage/.tmp/coverage-12.json +1 -1
  6. package/coverage/.tmp/coverage-13.json +1 -1
  7. package/coverage/.tmp/coverage-15.json +1 -1
  8. package/coverage/.tmp/coverage-16.json +1 -1
  9. package/coverage/.tmp/coverage-17.json +1 -1
  10. package/coverage/.tmp/coverage-18.json +1 -1
  11. package/coverage/.tmp/coverage-19.json +1 -1
  12. package/coverage/.tmp/coverage-2.json +1 -1
  13. package/coverage/.tmp/coverage-21.json +1 -1
  14. package/coverage/.tmp/coverage-22.json +1 -1
  15. package/coverage/.tmp/coverage-24.json +1 -1
  16. package/coverage/.tmp/coverage-25.json +1 -1
  17. package/coverage/.tmp/coverage-27.json +1 -1
  18. package/coverage/.tmp/coverage-28.json +1 -1
  19. package/coverage/.tmp/coverage-29.json +1 -1
  20. package/coverage/.tmp/coverage-3.json +1 -1
  21. package/coverage/.tmp/coverage-30.json +1 -1
  22. package/coverage/.tmp/coverage-32.json +1 -1
  23. package/coverage/.tmp/coverage-33.json +1 -1
  24. package/coverage/.tmp/coverage-34.json +1 -1
  25. package/coverage/.tmp/coverage-36.json +1 -1
  26. package/coverage/.tmp/coverage-37.json +1 -1
  27. package/coverage/.tmp/coverage-38.json +1 -1
  28. package/coverage/.tmp/coverage-39.json +1 -1
  29. package/coverage/.tmp/coverage-4.json +1 -1
  30. package/coverage/.tmp/coverage-40.json +1 -1
  31. package/coverage/.tmp/coverage-41.json +1 -1
  32. package/coverage/.tmp/coverage-42.json +1 -1
  33. package/coverage/.tmp/coverage-5.json +1 -1
  34. package/coverage/.tmp/coverage-6.json +1 -1
  35. package/coverage/.tmp/coverage-7.json +1 -1
  36. package/coverage/.tmp/coverage-8.json +1 -1
  37. package/coverage/.tmp/coverage-9.json +1 -1
  38. package/lib/cjs/components/Slider/Slider.js +51 -15
  39. package/lib/cjs/components/Slider/Slider.js.map +1 -1
  40. package/lib/esm/components/Slider/Slider.js +53 -17
  41. package/lib/esm/components/Slider/Slider.js.map +1 -1
  42. package/lib/src/components/Slider/Slider.d.ts +1 -1
  43. package/lib/types/components/Slider/Slider.d.ts +1 -1
  44. package/package.json +2 -2
  45. package/src/components/Slider/Slider.tsx +92 -20
  46. package/src/components/Slider/demo/index.tsx +18 -0
@@ -20,9 +20,11 @@ var Slider = function Slider(_ref) {
20
20
  initalValue = _ref$initalValue === void 0 ? 0 : _ref$initalValue,
21
21
  onValueChange = _ref.onValueChange,
22
22
  _ref$dotStyle = _ref.dotStyle,
23
- dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle;
23
+ dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle,
24
+ _ref$step = _ref.step,
25
+ step = _ref$step === void 0 ? 1 : _ref$step;
24
26
  pvCount_useUnmountedProcess.default("Slider");
25
- var _useState = React.useState(reactNative.Dimensions.get("window").width * 0.8),
27
+ var _useState = React.useState(reactNative.Dimensions.get("window").width),
26
28
  _useState2 = _rollupPluginBabelHelpers._slicedToArray(_useState, 2),
27
29
  sliderWidth = _useState2[0],
28
30
  setSliderWidth = _useState2[1];
@@ -36,24 +38,50 @@ var Slider = function Slider(_ref) {
36
38
  if (value < min || value > max) {
37
39
  return;
38
40
  }
41
+ var getSteppedValue = React.useCallback(function (rawValue) {
42
+ var steppedValue = Math.round((rawValue - min) / step) * step + min;
43
+ return Math.max(min, Math.min(max, steppedValue));
44
+ }, [min, max, step]);
39
45
  var animatedValue = React.useRef(new reactNative.Animated.Value(initalValue * sliderWidth / (max - min))).current;
46
+ var animatedThumbValue = React.useRef(new reactNative.Animated.Value(initalValue * sliderWidth / (max - min) > 0 ? initalValue * sliderWidth / (max - min) - 8 : initalValue * sliderWidth / (max - min))).current;
40
47
  React.useEffect(function () {
41
48
  var handleOrientationChange = function handleOrientationChange() {
42
- setSliderWidth(reactNative.Dimensions.get("window").width * 0.8);
49
+ setSliderWidth(reactNative.Dimensions.get("window").width);
43
50
  };
44
51
  var subscription = reactNative.Dimensions.addEventListener("change", handleOrientationChange);
45
52
  return function () {
46
53
  subscription.remove();
47
54
  };
48
55
  }, []);
49
- var hanleValueUpdate = function hanleValueUpdate(gestureState) {
50
- var currentValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
51
- setValue(currentValue);
52
- animatedValue.setValue(currentValue * sliderWidth / (max - min));
56
+ var hanleValueUpdate = React.useCallback(function (gestureState) {
57
+ var rawValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
58
+ var steppedValue = getSteppedValue(rawValue);
59
+ setValue(steppedValue);
60
+ animatedValue.setValue(steppedValue * sliderWidth / (max - min));
61
+ animatedThumbValue.setValue(steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min));
53
62
  if (onValueChange) {
54
- onValueChange(currentValue);
63
+ onValueChange(steppedValue);
55
64
  }
56
- };
65
+ }, [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange]);
66
+ var handleTrackPress = React.useCallback(function (event) {
67
+ var locationX = event.nativeEvent.locationX;
68
+ var rawValue = locationX / sliderWidth * (max - min) + min;
69
+ var steppedValue = getSteppedValue(rawValue);
70
+ setValue(steppedValue);
71
+ reactNative.Animated.timing(animatedValue, {
72
+ toValue: steppedValue * sliderWidth / (max - min),
73
+ duration: 200,
74
+ useNativeDriver: false
75
+ }).start();
76
+ reactNative.Animated.timing(animatedThumbValue, {
77
+ toValue: steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min),
78
+ duration: 200,
79
+ useNativeDriver: false
80
+ }).start();
81
+ if (onValueChange) {
82
+ onValueChange(steppedValue);
83
+ }
84
+ }, [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue]);
57
85
  var handleLayout = function handleLayout(event) {
58
86
  setSliderWidth(event.nativeEvent.layout.width);
59
87
  };
@@ -76,7 +104,7 @@ var Slider = function Slider(_ref) {
76
104
  hanleValueUpdate(gestureState);
77
105
  }
78
106
  });
79
- }, []);
107
+ }, [hanleValueUpdate]);
80
108
  var styles2 = reactNative.StyleSheet.create({
81
109
  sliderContainer: {
82
110
  flexDirection: "row",
@@ -84,7 +112,7 @@ var Slider = function Slider(_ref) {
84
112
  justifyContent: "center"
85
113
  },
86
114
  trackContainer: {
87
- width: "80%",
115
+ width: "100%",
88
116
  height: 4,
89
117
  backgroundColor: "rgba(48, 48, 52, 0.20)",
90
118
  borderRadius: 2
@@ -113,18 +141,26 @@ var Slider = function Slider(_ref) {
113
141
  }
114
142
  });
115
143
  return /* @__PURE__ */React.createElement(reactNative.View, {
116
- style: styles2.sliderContainer,
144
+ style: styles2.sliderContainer
145
+ }, /* @__PURE__ */React.createElement(reactNative.View, {
146
+ style: styles2.trackContainer,
117
147
  onLayout: handleLayout
148
+ }, /* @__PURE__ */React.createElement(reactNative.TouchableWithoutFeedback, {
149
+ onPress: handleTrackPress
118
150
  }, /* @__PURE__ */React.createElement(reactNative.View, {
119
- style: styles2.trackContainer
120
- }, /* @__PURE__ */React.createElement(reactNative.Animated.View, {
151
+ style: {
152
+ position: "absolute",
153
+ width: "100%",
154
+ height: 4
155
+ }
156
+ })), /* @__PURE__ */React.createElement(reactNative.Animated.View, {
121
157
  style: [styles2.coloredTrack, {
122
158
  width: animatedValue
123
159
  }]
124
160
  }), /* @__PURE__ */React.createElement(reactNative.Animated.View, _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({
125
161
  style: [styles2.thumbButton, {
126
162
  transform: [{
127
- translateX: animatedValue
163
+ translateX: animatedThumbValue
128
164
  }]
129
165
  }, dotStyle]
130
166
  }, panResponder.panHandlers), {}, {
@@ -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 [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 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 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 [],\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 return (\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 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","useMounted","_useState","useState","Dimensions","get","width","_useState2","_slicedToArray","sliderWidth","setSliderWidth","_useState3","_useState4","value","setValue","animatedValue","useRef","Animated","Value","current","useEffect","handleOrientationChange","subscription","addEventListener","remove","hanleValueUpdate","gestureState","currentValue","Math","dx","handleLayout","event","nativeEvent","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","React","createElement","View","style","onLayout","_objectSpread","transform","translateX","panHandlers","hitSlop","bottom","left","right","defaultProps","SliderDefaultProps"],"mappings":"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"}
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":"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"}
@@ -1,6 +1,6 @@
1
1
  import { _ as _slicedToArray, a as _objectSpread2 } from '../../_chunks/CAkwE9ZD.js';
2
- import React, { useState, useRef, useEffect, useMemo } from 'react';
3
- import { Dimensions, Animated, PanResponder, StyleSheet, View } from 'react-native';
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,9 +16,11 @@ 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(Dimensions.get("window").width * 0.8),
23
+ var _useState = useState(Dimensions.get("window").width),
22
24
  _useState2 = _slicedToArray(_useState, 2),
23
25
  sliderWidth = _useState2[0],
24
26
  setSliderWidth = _useState2[1];
@@ -32,24 +34,50 @@ var Slider = function Slider(_ref) {
32
34
  if (value < min || value > max) {
33
35
  return;
34
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]);
35
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;
36
43
  useEffect(function () {
37
44
  var handleOrientationChange = function handleOrientationChange() {
38
- setSliderWidth(Dimensions.get("window").width * 0.8);
45
+ setSliderWidth(Dimensions.get("window").width);
39
46
  };
40
47
  var subscription = Dimensions.addEventListener("change", handleOrientationChange);
41
48
  return function () {
42
49
  subscription.remove();
43
50
  };
44
51
  }, []);
45
- var hanleValueUpdate = function hanleValueUpdate(gestureState) {
46
- var currentValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
47
- setValue(currentValue);
48
- animatedValue.setValue(currentValue * sliderWidth / (max - min));
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));
49
58
  if (onValueChange) {
50
- onValueChange(currentValue);
59
+ onValueChange(steppedValue);
51
60
  }
52
- };
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]);
53
81
  var handleLayout = function handleLayout(event) {
54
82
  setSliderWidth(event.nativeEvent.layout.width);
55
83
  };
@@ -72,7 +100,7 @@ var Slider = function Slider(_ref) {
72
100
  hanleValueUpdate(gestureState);
73
101
  }
74
102
  });
75
- }, []);
103
+ }, [hanleValueUpdate]);
76
104
  var styles2 = StyleSheet.create({
77
105
  sliderContainer: {
78
106
  flexDirection: "row",
@@ -80,7 +108,7 @@ var Slider = function Slider(_ref) {
80
108
  justifyContent: "center"
81
109
  },
82
110
  trackContainer: {
83
- width: "80%",
111
+ width: "100%",
84
112
  height: 4,
85
113
  backgroundColor: "rgba(48, 48, 52, 0.20)",
86
114
  borderRadius: 2
@@ -109,18 +137,26 @@ var Slider = function Slider(_ref) {
109
137
  }
110
138
  });
111
139
  return /* @__PURE__ */React.createElement(View, {
112
- style: styles2.sliderContainer,
140
+ style: styles2.sliderContainer
141
+ }, /* @__PURE__ */React.createElement(View, {
142
+ style: styles2.trackContainer,
113
143
  onLayout: handleLayout
144
+ }, /* @__PURE__ */React.createElement(TouchableWithoutFeedback, {
145
+ onPress: handleTrackPress
114
146
  }, /* @__PURE__ */React.createElement(View, {
115
- style: styles2.trackContainer
116
- }, /* @__PURE__ */React.createElement(Animated.View, {
147
+ style: {
148
+ position: "absolute",
149
+ width: "100%",
150
+ height: 4
151
+ }
152
+ })), /* @__PURE__ */React.createElement(Animated.View, {
117
153
  style: [styles2.coloredTrack, {
118
154
  width: animatedValue
119
155
  }]
120
156
  }), /* @__PURE__ */React.createElement(Animated.View, _objectSpread2(_objectSpread2({
121
157
  style: [styles2.thumbButton, {
122
158
  transform: [{
123
- translateX: animatedValue
159
+ translateX: animatedThumbValue
124
160
  }]
125
161
  }, dotStyle]
126
162
  }, panResponder.panHandlers), {}, {
@@ -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 [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 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 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 [],\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 return (\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 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","useMounted","_useState","useState","Dimensions","get","width","_useState2","_slicedToArray","sliderWidth","setSliderWidth","_useState3","_useState4","value","setValue","animatedValue","useRef","Animated","Value","current","useEffect","handleOrientationChange","subscription","addEventListener","remove","hanleValueUpdate","gestureState","currentValue","Math","dx","handleLayout","event","nativeEvent","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","React","createElement","View","style","onLayout","_objectSpread","transform","translateX","panHandlers","hitSlop","bottom","left","right","defaultProps","SliderDefaultProps"],"mappings":"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"}
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":"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"}
@@ -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-beta202511051512",
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-beta202511051512"
29
+ "@xhsreds/reds-token-next": "0.10.1-beta202511051557"
30
30
  },
31
31
  "peerDependenciesMeta": {
32
32
  "ozone-schema-web": {
@@ -15,9 +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 = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChange, dotStyle = {} }: RedsSlider) => {
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 [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width * 0.8);
28
+ const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width);
21
29
  const [value, setValue] = useState(initalValue);
22
30
 
23
31
  if (max < min) {
@@ -27,31 +35,90 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
27
35
  return;
28
36
  }
29
37
 
30
- const thumbPosition = (value / (max - min)) * sliderWidth;
31
- const step = 1;
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
+
32
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
+
33
57
  useEffect(() => {
34
58
  const handleOrientationChange = () => {
35
- setSliderWidth(Dimensions.get("window").width * 0.8);
59
+ setSliderWidth(Dimensions.get("window").width);
36
60
  };
37
61
 
38
62
  const subscription = Dimensions.addEventListener("change", handleOrientationChange);
39
63
  return () => {
40
64
  subscription.remove();
41
- //Dimensions.removeEventListener("change", handleOrientationChange);
42
65
  };
43
66
  }, []);
44
67
 
45
68
  // 可以根据需要调整的滑块高度
46
- const hanleValueUpdate = (gestureState: PanResponderGestureState) => {
47
- const currentValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
48
-
49
- setValue(currentValue);
50
- animatedValue.setValue((currentValue * sliderWidth) / (max - min));
51
- if (onValueChange) {
52
- onValueChange(currentValue);
53
- }
54
- };
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
+ );
55
122
 
56
123
  const handleLayout = (event: LayoutChangeEvent) => {
57
124
  setSliderWidth(event.nativeEvent.layout.width);
@@ -69,7 +136,7 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
69
136
  hanleValueUpdate(gestureState);
70
137
  },
71
138
  }),
72
- [],
139
+ [hanleValueUpdate],
73
140
  );
74
141
 
75
142
  const styles = StyleSheet.create({
@@ -79,7 +146,7 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
79
146
  justifyContent: "center",
80
147
  },
81
148
  trackContainer: {
82
- width: "80%",
149
+ width: "100%",
83
150
  height: 4,
84
151
  backgroundColor: "rgba(48, 48, 52, 0.20)",
85
152
  borderRadius: 2,
@@ -106,11 +173,16 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
106
173
  });
107
174
 
108
175
  return (
109
- <View style={styles.sliderContainer} onLayout={handleLayout}>
110
- <View style={styles.trackContainer}>
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
+
111
183
  <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
112
184
  <Animated.View
113
- style={[styles.thumbButton, { transform: [{ translateX: animatedValue }] }, dotStyle]}
185
+ style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}
114
186
  {...panResponder.panHandlers}
115
187
  hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
116
188
  />
@@ -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
  }