Стальная пластина дрожит, и песок на ней собирается в узловые линии фигур Хладни. Сама по себе пластина раз в несколько секунд переключается на следующую резонансную моду, а песчинки при этом встряхиваются и заново укладываются в новую фигуру. Палец (или курсор в вебе) плавно меняет частоты: по горизонтали и вертикали задаются разные моды, а касание встряхивает песок. Стоит отпустить — пластина вернётся к собственному циклу.
Шейдер считается целиком на GPU через Skia, время, моды и сила толчка живут на UI-потоке Reanimated — React не перерисовывается на каждом кадре. Анимация замирает, когда включено «Уменьшение движения», приложение свёрнуто или передан paused. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install @shopify/react-native-skia react-native-reanimated react-native-gesture-handlerpnpm add @shopify/react-native-skia react-native-reanimated react-native-gesture-handleryarn add @shopify/react-native-skia react-native-reanimated react-native-gesture-handlerbun add @shopify/react-native-skia react-native-reanimated react-native-gesture-handlerСкопируйте эти файлы в src/shared/components/organisms/cymatics/:
Код доступен по подпискеPro
Исходник «Киматика» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Киматика» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
По умолчанию компонент занимает ширину родителя и высоту height. Чтобы растянуть его фоном на весь экран, передайте fill.
speed?Тип number
drive?Тип number
sandColor?Тип string
interval?Тип number
interactive?Тип boolean
paused?Тип boolean
fill?Тип boolean
width?Тип number
height?Тип number
borderRadius?Тип number
children?Тип ReactNode
style?Тип StyleProp<ViewStyle>