Компоненты/Тасовка фото

Тасовка фото

Pro
27 сентября 2026

Нажатие перекладывает верхнее фото стопки вниз с пружинным броском

Установка

import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";

Установка через CLIPro

Команда станет доступна после оформления Pro.

Оформить ProВойти

Файлы

index.tsx
НазадФото-лайтбоксДалееПеремешивание фото

Как это работает

Фото лежат стопкой с лёгким разбросом углов (spread). По нажатию верхний снимок отлетает в сторону (по очереди влево и вправо), в крайней точке уходит под стопку и пружиной возвращается на место, а остальные поднимаются на уровень выше.

Порядок хранится на UI-потоке, поэтому быстрые нажатия не вызывают ререндеров React. onShuffle сообщает индекс нового верхнего фото, ref.current?.shuffle() тасует из кода.

Вручную

Поставьте зависимости:

npm install react-native-gesture-handler react-native-reanimated react-native-worklets
pnpm add react-native-gesture-handler react-native-reanimated react-native-worklets
yarn add react-native-gesture-handler react-native-reanimated react-native-worklets
bun add react-native-gesture-handler react-native-reanimated react-native-worklets

Скопируйте эти файлы в src/shared/components/molecules/photo-shuffle/:

index.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface PhotoShuffleProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function PhotoShuffle({
speed = 1,
intensity = 0.6,
interactive = true,
}: PhotoShuffleProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Тасовка фото» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.

Оформить ProВойти

Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.

Использование

usage.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface PhotoShuffleProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function PhotoShuffle({
speed = 1,
intensity = 0.6,
interactive = true,
}: PhotoShuffleProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Тасовка фото» открывается с подпиской 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>

Методы через ref

Пропс
Описание
shuffle

Тип () => void