Портретные карточки бесконечно едут по дуге: в центре они стоят ровно и выше всего, а к краям опускаются и наклоняются, как на колесе обозрения. Края ленты мягко затухают через маску с градиентом.
Ленту можно протянуть пальцем или мышью и бросить с инерцией, а в вебе при наведении движение плавно останавливается. Движение считается в кадровом колбэке Reanimated на UI-потоке; при «Уменьшении движения» лента стоит на месте. На экранах уже 640 px карточки уменьшаются на mobileScale. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install @react-native-masked-view/masked-view expo-linear-gradient react-native-gesture-handler react-native-reanimatedpnpm add @react-native-masked-view/masked-view expo-linear-gradient react-native-gesture-handler react-native-reanimatedyarn add @react-native-masked-view/masked-view expo-linear-gradient react-native-gesture-handler react-native-reanimatedbun add @react-native-masked-view/masked-view expo-linear-gradient react-native-gesture-handler react-native-reanimatedСкопируйте эти файлы в src/shared/components/organisms/arc-marquee/:
Код доступен по подпискеPro
Исходник «Бегущая дуга» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Бегущая дуга» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
src у изображения — адрес или require(...).
images?Тип readonly IArcImage[]
cardWidth?Тип number
cardHeight?Тип number
gap?Тип number
speed?Тип number
curveDepth?Тип number
maxRotate?Тип number
pauseOnHover?Тип boolean
draggable?Тип boolean
mobileScale?Тип number
direction?Тип 1 | -1
label?Тип string
style?Тип StyleProp<ViewStyle>