Фото лежат стопкой с лёгким разбросом углов (spread). По нажатию верхний снимок отлетает в сторону (по очереди влево и вправо), в крайней точке уходит под стопку и пружиной возвращается на место, а остальные поднимаются на уровень выше.
Порядок хранится на UI-потоке, поэтому быстрые нажатия не вызывают ререндеров React. onShuffle сообщает индекс нового верхнего фото, ref.current?.shuffle() тасует из кода.
Поставьте зависимости:
npm install react-native-gesture-handler react-native-reanimated react-native-workletspnpm add react-native-gesture-handler react-native-reanimated react-native-workletsyarn add react-native-gesture-handler react-native-reanimated react-native-workletsbun add react-native-gesture-handler react-native-reanimated react-native-workletsСкопируйте эти файлы в src/shared/components/molecules/photo-shuffle/:
Код доступен по подпискеPro
Исходник «Тасовка фото» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Тасовка фото» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
imagesТип readonly PhotoShuffleImage[]
width?Тип number
height?Тип number
radius?Тип number
spread?Тип number
throwDistance?Тип number
borderColor?Тип string
borderWidth?Тип number
onShuffle?Тип (topIndex: number) => void
style?Тип StyleProp<ViewStyle>
shuffleТип () => void