Реализация Spin-the-Wheel (колесо фортуны) в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация Spin-the-Wheel (колесо фортуны) в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация Spin-the-Wheel (колесо фортуны) в мобильном приложении

Колесо фортуны — геймификационный элемент с узнаваемой механикой. Пользователь тянет, колесо раскручивается, замедляется с нарастающим саспенсом и останавливается на призе. Простая идея, но дьявол в деталях: физика вращения, точность остановки на нужном секторе и визуальный фидбек при победе определяют, будет ли это ощущаться как «казино» или как «сломанный счётчик».

Физика вращения

Колесо должно вести себя как реальный физический объект с инерцией. Не просто «крутиться N секунд и останавливаться» — а замедляться по экспоненциальному закону, имитируя трение.

Базовая модель:

// Угловая скорость уменьшается каждый кадр
angularVelocity *= decelerationFactor  // 0.96–0.98 для медленного замедления

// CADisplayLink обновляет угол каждый кадр
currentAngle += angularVelocity * dt
wheelLayer.transform = CATransform3DMakeRotation(currentAngle, 0, 0, 1)

// Остановка при достижении минимальной скорости
if abs(angularVelocity) < 0.01 { stopAndSnap() }

decelerationFactor — ключевой параметр. 0.99 даёт долгое замедление (ощущение тяжёлого барабана), 0.95 — резкое (лёгкое). Настраиваем под ощущение бренда.

Точная остановка на нужном секторе

Честная рандомизация + точная остановка на определённом секторе — не противоречие. Алгоритм:

  1. Определяем победный сектор до начала вращения (серверная логика или клиентская с seed)
  2. Вычисляем целевой угол остановки: targetAngle = sectorMidpoint + randomOffset(±halfSectorAngle)
  3. Корректируем decelerationFactor так, чтобы колесо завершило нужное число оборотов и остановилось в targetAngle

Формула для decelerationFactor при известных initialVelocity и targetAngle:

let totalRotation = currentAngle + (Double(minFullRotations) * 2 * .pi) + targetAngle
// Решаем геометрическую прогрессию: sum = v0 / (1 - factor)
decelerationFactor = 1 - initialVelocity / totalRotation

Это скрывает предопределённость результата — колесо выглядит случайным, но останавливается там, где нужно.

Snap-анимация при остановке

Небольшой «отскок» в конце усиливает ощущение реальности. Реализуем через CASpringAnimation:

let snapAnimation = CASpringAnimation(keyPath: "transform.rotation.z")
snapAnimation.fromValue = currentAngle
snapAnimation.toValue = snappedAngle
snapAnimation.stiffness = 200
snapAnimation.damping = 15
snapAnimation.initialVelocity = angularVelocity

Визуальный фидбек при победе

  • Haptic feedback: UINotificationFeedbackGenerator.notificationOccurred(.success) в момент остановки на iOS; VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE) на Android
  • Lottie-конфетти: отдельный overlay поверх колеса, воспроизводится после остановки
  • Подсветка сектора: CALayer с анимацией shadowOpacity 0 → 1 → 0 трижды (мигание)

Реализация по платформам

iOS: CADisplayLink для физики + CALayer или UIView вращение. Сектора рисуем через CAShapeLayer с UIBezierPath.

Android: ValueAnimator с кастомным TimeInterpolator (логарифмическое замедление) + кастомный View с Canvas.drawArc.

Flutter: AnimationController с кастомным Simulation (наследник SpringSimulation или собственный) + CustomPainter для рисования секторов.

React Native: Animated.Value с useNativeDriver: true + react-native-svg для графики секторов, либо готовый пакет react-native-wheel-pick.

Срок: 2–3 дня включает физику, логику остановки, визуальный фидбек и интеграцию с серверной логикой призов.