Металлическая ручка с рисками шкалы, которую крутят пальцем или мышью. Поворот идёт жестом Gesture Handler с пружинной инерцией на Reanimated, на каждом делении срабатывает лёгкая вибрация через Expo Haptics, а в крайних положениях ручка упирается в ограничитель с более сильным откликом. Пластина, тени и шкала рисуются в Skia.
Для VoiceOver и TalkBack ручка — регулируемый элемент: значение меняется жестами увеличения и уменьшения. В вебе вместо вибрации слышен щелчок, а стрелки, Page Up/Down, Home и End меняют значение с клавиатуры. При «Уменьшении движения» ручка встаёт на место без пружины. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-workletspnpm add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-workletsyarn add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-workletsbun add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-workletsСкопируйте эти файлы в src/shared/components/molecules/physical-knob/:
Код доступен по подпискеPro
Исходник «Физическая ручка» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Физическая ручка» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Значение контролируемое: храните его в состоянии и передавайте обратно через value и onChange.
size?Тип number
value?Тип number
min?Тип number
max?Тип number
accentColor?Тип string
onChange?Тип (value: number) => void
theme?Тип KnobTheme
sound?Тип boolean
haptics?Тип boolean
accessibilityLabel?Тип string
style?Тип StyleProp<ViewStyle>