Компоненты/Физическая ручка

Физическая ручка

Pro
28 сентября 2026

Реалистичная поворотная ручка с пружинной инерцией, щелчками звука, вибрацией и управлением с клавиатуры.

Установка

import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";

Установка через CLIPro

Команда станет доступна после оформления Pro.

Оформить ProВойти

Файлы

index.tsx
НазадРаскрывающаяся стопкаДалееПиксельный прелоадер

Металлическая ручка с рисками шкалы, которую крутят пальцем или мышью. Поворот идёт жестом 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-worklets
pnpm add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-worklets
yarn add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-worklets
bun add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated expo-haptics react-native-worklets

Скопируйте эти файлы в src/shared/components/molecules/physical-knob/:

index.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface PhysicalKnobProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function PhysicalKnob({
speed = 1,
intensity = 0.6,
interactive = true,
}: PhysicalKnobProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Физическая ручка» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.

Оформить ProВойти

Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.

Использование

usage.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface PhysicalKnobProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function PhysicalKnob({
speed = 1,
intensity = 0.6,
interactive = true,
}: PhysicalKnobProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Физическая ручка» открывается с подпиской 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>