Лужа чёрной глянцевой феррожидкости лежит на дне тёмной чаши. Палец работает как магнит: под ним жидкость вздымается холмом и прорастает гексагональной решёткой острых шипов, которые пульсируют и бликуют в свете двух источников. Пока экрана никто не касается, невидимый магнит сам медленно блуждает над поверхностью; в вебе магнит следует и за курсором.
Шейдер считается целиком на 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/ferrofluid/:
Код доступен по подпискеPro
Исходник «Феррожидкость» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Феррожидкость» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
По умолчанию компонент занимает ширину родителя и высоту height. Чтобы растянуть его фоном на весь экран, передайте fill.
speed?Тип number
strength?Тип number
color?Тип string
density?Тип number
interactive?Тип boolean
paused?Тип boolean
fill?Тип boolean
width?Тип number
height?Тип number
borderRadius?Тип number
children?Тип ReactNode
style?Тип StyleProp<ViewStyle>