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