Обложки выстроены в объёмную ленту: центральная смотрит прямо, соседние развёрнуты и собраны в стопки по бокам. Ленту листают свайпом — после отпускания она доезжает до ближайшей обложки на пружине, — а касание обложки прокручивает прямо к ней. В вебе добавляются колесо, тачпад и стрелки на клавиатуре.
Под обложками может отображаться отражение. Каждый шаг сопровождается лёгкой вибрацией на iOS и Android и тихим щелчком в вебе. Анимация идёт на UI-потоке Reanimated, а при «Уменьшении движения» или reduceMotion лента переключается сразу, без пружины. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install expo-haptics expo-linear-gradient react-native-gesture-handler react-native-reanimatedpnpm add expo-haptics expo-linear-gradient react-native-gesture-handler react-native-reanimatedyarn add expo-haptics expo-linear-gradient react-native-gesture-handler react-native-reanimatedbun add expo-haptics expo-linear-gradient react-native-gesture-handler react-native-reanimatedСкопируйте эти файлы в src/shared/components/organisms/cover-flow/:
Код доступен по подпискеPro
Исходник «Cover Flow» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Cover Flow» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
itemsТип readonly ICoverFlowItem[]
itemWidth?Тип number
itemHeight?Тип number
stackSpacing?Тип number
centerGap?Тип number
rotation?Тип number
initialIndex?Тип number
enableReflection?Тип boolean
enableClickToSnap?Тип boolean
enableScroll?Тип boolean
enableAudio?Тип boolean
scrollMode?Тип CoverFlowScrollMode
scrollThreshold?Тип number
reduceMotion?Тип boolean
backgroundColor?Тип string
titleColor?Тип string
style?Тип StyleProp<ViewStyle>
onItemClick?Тип (item: ICoverFlowItem, index: number) => void
onIndexChange?Тип (index: number) => void