Ручка вращается жестом вокруг центра: угол считается через atan2, приращения копятся, у крайних упоров включается резиновое сопротивление. Между делениями ручку слегка притягивает к ближайшему упору, быстрый бросок докручивается по инерции и оседает на делении. На iOS и Android каждый пройденный упор отдаёт лёгкую вибрацию, в вебе вместо неё только вспышка деления. Ручка, насечки и шкала рисуются в Skia.
Поставьте зависимости:
npm install expo-status-bar react-native-gesture-handler react-native-reanimated @shopify/react-native-skia expo-haptics react-native-workletspnpm add expo-status-bar react-native-gesture-handler react-native-reanimated @shopify/react-native-skia expo-haptics react-native-workletsyarn add expo-status-bar react-native-gesture-handler react-native-reanimated @shopify/react-native-skia expo-haptics react-native-workletsbun add expo-status-bar react-native-gesture-handler react-native-reanimated @shopify/react-native-skia expo-haptics react-native-workletsСкопируйте эти файлы в src/shared/components/organisms/rotary-knob/:
Код доступен по подпискеPro
Исходник «Поворотная ручка» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Поворотная ручка» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
value?Тип number
defaultValue?Тип number
onValueChange?Тип (value: number) => void
min?Тип number
max?Тип number
steps?Тип number
size?Тип number
sweep?Тип number
accent?Тип string
label?Тип string
formatValue?Тип (value: number) => string
haptics?Тип boolean
disabled?Тип boolean
theme?Тип TRotaryKnobTheme
style?Тип StyleProp<ViewStyle>