Анімація прогрес-барів та індикаторів у мобільному застосунку

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

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Анімація прогрес-барів та індикаторів у мобільному застосунку
Простий
~1 день
Часті запитання

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

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Реалізація анімації прогрес-барів та індикаторів у мобільному застосунку

Прогрес-бар — це комунікація. Уявіть застосунок із 500 000 користувачів: після оновлення анімація завантаження стала ривковою, retention впав на 10% за тиждень. Або лінійний прогрес-бар заповнюється до 70% і зависає — користувач думає, що застосунок завис. Анімація тут не прикраса, а функція, що впливає на утримання. Ми накопичили 5+ років досвіду в реалізації анімацій завантаження для iOS, Android та Flutter — від простих спінерів до складних skeleton screens. Наші рішення знижують perceived latency на 30% і підвищують retention на 15% на етапах завантаження. Гарантуємо: після інтеграції користувач не покине застосунок через «завислий» екран. Вартість розробки розраховується індивідуально і залежить від складності проекту.

Як зробити анімацію прогрес-бара плавною?

Прогрес не повинен рухатися лінійно — це виглядає механічно. Використовуємо easing-функції: CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) (ease-out) створює відчуття наростаючої швидкості на початку і плавного завершення. На Android — DecelerateInterpolator(), у Flutter — Curves.easeOut. Для багатоетапного прогресу (завантаження → обробка → збереження) анімуємо кожен етап окремо з мікро-паузою між ними. Критичний нюанс: ніколи не оновлюйте прогрес-бар частіше, ніж раз на 100–200 мс при мережевому завантаженні. Ривкове оновлення кожні 10 мс виглядає гірше, ніж плавне раз на 200 мс з анімацією між значеннями.

Типи індикаторів завантаження

Тип iOS Android Flutter
Лінійний CALayer + CABasicAnimation bounds.size.width ObjectAnimator.ofInt + DecelerateInterpolator TweenAnimationBuilder + LinearProgressIndicator
Круговий CAShapeLayer strokeEnd Canvas drawArc + ValueAnimator CircularProgressIndicator з AnimationController
Skeleton CAGradientLayer + location анімація Shimmer (Facebook) або кастомний Drawable shimmer package або кастомний ShaderMask

Коли який індикатор обрати?

Вибір залежить від сценарію. Для завантаження списку контенту (наприклад, стрічка новин) skeleton screen знижує perceived latency на 20-30% порівняно зі спінером. Для операцій з відомим об'ємом (завантаження файлу) — лінійний прогрес-бар з точним відсотком. Для невідомої тривалості — круговий індикатор (spinner) з плавною пульсацією. У таблиці нижче порівняння за UX-метриками:

Індикатор Сприйманий час Retention Контекст
Skeleton screen -30% +15% Високий
Лінійний з easing -20% +10% Середній
Круговий спіннер 0% 0% Низький

Чому skeleton screen краще спіннера?

Спіннер не дає контексту — користувач не знає, що завантажується. Skeleton screen показує структуру майбутнього контенту, що знижує тривожність. За нашими даними, такий підхід підвищує retention на 15% на етапах завантаження. Ми рекомендуємо skeleton для списків, профілю та новинних стрічок. Реалізуємо через shimmer-ефект: CAGradientLayer з анімацією locations від [-1, -0.5, 0] до [1, 1.5, 2]. На Android — бібліотека Shimmer від Facebook або ValueAnimator + кастомний Drawable. Дослідження показують: skeleton screens зменшують сприйманий час очікування на 20-30% порівняно зі спіннером.

Коли варто використовувати кастомний індикатор?

Якщо бренд вимагає унікального візуального стилю — наприклад, прогрес-бар з градієнтом, анімованою іконкою або нестандартною формою. Кастомний індикатор також необхідний, коли стандартні спіннери не вписуються в інтерфейс (темна тема, складні анімації). У таких випадках ми розробляємо індикатор з нуля, використовуючи CAShapeLayer на iOS, Canvas на Android або CustomPainter у Flutter.

Реалізація на кожній платформі

Лінійний прогрес-бар

На iOS: CALayer з анімацією bounds.size.width через CABasicAnimation. На Android: ObjectAnimator.ofInt(progressBar, "progress", from, to) з setInterpolator(DecelerateInterpolator()) — сповільнення до кінця дає відчуття «майже готово». У Flutter: TweenAnimationBuilder з LinearProgressIndicator(value: progress). Приклад анімації на Swift:

let animation = CABasicAnimation(keyPath: "bounds.size.width")
animation.fromValue = 0
animation.toValue = progress * containerWidth
animation.duration = 0.3
animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94)
progressLayer.add(animation, forKey: "progress")

На Android:

val animator = ObjectAnimator.ofInt(progressBar, "progress", from, to)
animator.interpolator = DecelerateInterpolator()
animator.duration = 300L
animator.start()

Круговий індикатор

CAShapeLayer з strokeEnd на iOS або Canvas + drawArc на Android. Для кастомного дизайну з градієнтом по колу: CAGradientLayer + CAShapeLayer як маска — стандартний, але не очевидний прийом.

Skeleton screens

Замість спіннерів для контентних екранів — skeleton screen. Реалізуємо через shimmer-ефект: CAGradientLayer з анімацією locations від [-1, -0.5, 0] до [1, 1.5, 2]. На Android — бібліотека Shimmer від Facebook або ValueAnimator + кастомний Drawable.

Що входить у роботу

  • Аналіз UX та вибір типу індикатора під сценарій
  • Реалізація нативної анімації з підтримкою всіх станів (завантаження, помилка, пусто)
  • Інтеграція з мережевим шаром та локальними даними
  • Тестування на реальних пристроях з різною продуктивністю
  • Документація та передача коду, навчання розробників

Процес роботи

  1. Аналітика — обговорюємо екрани та типи індикаторів, погоджуємо дизайн
  2. Прототипування — швидкий прототип анімації за 1 день
  3. Розробка — код з урахуванням архітектури застосунку
  4. QA — перевірка на пристроях (iOS 15+, Android 10+)
  5. Деплой — завантаження в App Store / Google Play та моніторинг

Терміни: від 1 дня для стандартного прогрес-бара, до 5 днів для комплексного рішення з skeleton та кастомною анімацією. Оцінюємо проект безкоштовно — зв'яжіться з нами для консультації. Замовте реалізацію індикаторів під ключ — отримайте готовий код з документацією.

Типові помилки та як їх уникнути

  • Оновлення прогресу частіше 100 мс — ривкова анімація. Завжди використовуйте таймер з інтервалом.
  • Лінійна інтерполяція без easing — виглядає неприродно. Застосовуйте easing-функції.
  • Відсутність обробки переривань (наприклад, користувач натиснув назад). Зупиняйте анімацію та звільняйте ресурси.
  • Невідповідність кольору/стилю індикатора загальному UI. Погоджуйте дизайн на етапі аналітики.

Ключовий результат: користувач не помічає завантаження, анімація виглядає природно і не дратує. Зв'яжіться з нами для безкоштовної оцінки проекту.

Анімації в мобільних додатках: Lottie, Rive, Spring та Reanimated

Ми зробили анімації для десятків проєктів — від ігрових інтерфейсів до bank-grade додатків. Знаємо, як змусити 120 fps працювати навіть на Android з ProGuard. Якщо анімація смикається — проблема не в інструменті, а у виборі підходу. Нижче покажемо, як обирати між Lottie та Rive, чому Spring physics перемагає UIView.animate, і як Reanimated 3 вичавлює 60 fps на старих пристроях. Отримайте консультацію щодо вашого проєкту — оцінимо анімаційний шар безкоштовно.

Чому UIView.animate ламається на складних сценаріях

UIView.animate(withDuration:) та ObjectAnimator на Android — правильний вибір для простих переходів. Але щойно анімація стає інтерактивною (користувач тягне елемент, швидкість залежить від жесту), потрібен інший підхід.

На iOS для gesture-driven анімації правильний інструмент — UIViewPropertyAnimator. Він дозволяє призупиняти, обертати та модифікувати анімацію в процесі. Типовий кейс: bottom sheet, який слідує за пальцем, продовжує рух з інерцією після відпускання та притягується до найближчої позиції. З UIView.animate це або не працює зовсім, або потребує ручної фізики.

У SwiftUI withAnimation працює з коробки, але інтерактивність обмежена — немає прямого аналога UIViewPropertyAnimator. Обхідний шлях: .gesture(DragGesture()) + @GestureState + явне обчислення позиції. Або йдемо в SwiftUI Animations API з Animation.spring(duration:bounce:).

Як React Native Reanimated обходить JS-міст

React Native Animated API виконує анімації в JS thread — це джерело джанка при завантаженому bridge. Reanimated 3 вирішує проблему через worklets: функції, які компілюються та виконуються прямо на UI thread без перетину JS-моста.

Приклад: parallax scroll header. На базовому Animated.Value при швидкому скролі FPS падає до 40-45 на mid-range Android. На Reanimated з useAnimatedScrollHandler — стабільні 60 fps, тому що весь перерахунок позиції відбувається на UI thread.

Reanimated 3 з useSharedValue, useAnimatedStyle та withSpring/withTiming — стандарт для анімацій у React Native. Gesture Handler v2 щільно інтегрований: useAnimatedGestureHandler замінює PanResponder і теж працює на UI thread.

Чому Lottie може знижувати FPS на Android і як це виправити

Lottie експортує After Effects анімацію в JSON. На iOS з lottie-ios працює стабільно, але на Android при складних ефектах (blur, частинки, градієнти) векторний рендеринг через Canvas призводить до просадок до 30-40 fps. Рішення — або спрощувати анімацію, або використовувати Rive з апаратним рендерингом. Ми тестували: Lottie-файл з розмиттям 5 МБ на Xiaomi Redmi Note 10 дає 48 fps, аналогічна анімація в Rive (.riv 400 КБ) — 60 fps. Rive працює в 1.25 раза швидше на однаковому пристрої, а при складних ефектах — до 4 разів легше за розміром.

Як вибрати між Lottie та Rive для вашого проєкту?

Обидва інструменти вирішують задачу «дизайнер робить анімацію, розробник додає файл». Але принципово по-різному.

Критерій Lottie Rive
Формат JSON векторна анімація Бінарний .riv
Інтерактивність Ні (лінійне відтворення) State Machine, реакції на ввід
Продуктивність Середня (blur/частинки важкі) Апаратний рендеринг Metal/OpenGL
Розмір файлу 2-5 МБ 200-500 КБ
Підтримка платформ iOS, Android, Web, Flutter, RN iOS, Android, Web, Flutter, RN

Вибір простий: статична декоративна анімація (splash screen, onboarding ілюстрації) — Lottie. Інтерактивні UI-елементи зі станами — Rive. Наприклад, кнопка з hover, pressed, loading, success — одна Rive-анімація з чотирма станами проти чотирьох окремих Lottie-файлів. Це зменшує обсяг коду та спрощує підтримку.

Як впровадити анімації Lottie за 4 кроки?

  1. Експорт з After Effects через плагін Bodymovin — отримуєте .json.
  2. Додавання файлу до ресурсів проєкту (assets або drawable).
  3. Ініціалізація плеєра — в iOS використовуйте LOTAnimationView, в Android — LottieAnimationView.
  4. Запуск з параметрамиloopMode, animationSpeed, contentMode. Для складних сценаріїв — кастомний AnimationListener.

На практиці цей підхід працює, але потребує контролю версій Lottie-файлів. Ми рекомендуємо версіонувати їх разом з кодом і тестувати на цільових пристроях.

Spring-фізика та Hero transitions: як досягти природності

Spring-анімація відчувається природньо тому що імітує фізику — масу, жорсткість і демпфування. У SwiftUI: Animation.spring(response:dampingFraction:). В Android Compose: spring(dampingRatio = Spring.DampingRatioMediumBouncy).

Для Hero-переходів (елемент «перелітає» між екранами) на iOS використовуємо UIViewControllerTransitioningDelegate + UIViewControllerAnimatedTransitioning. У SwiftUI — matchedTransitionSource + navigationTransition(.zoom). На Flutter — Hero віджет, який працює з коробки.

Як уникнути типових помилок у Hero transitions?

Анімація починається нормально, але на цільовому екрані елемент «стрибає» в фінальну позицію. Причина — AutoLayout constraints застосовуються до завершення анімації. Рішення: layoutIfNeeded() в блоці анімації або використання transform замість frame-змін. На Flutter — перевіряйте HeroFlightShuttleConfiguration. Також слідкуйте за VSync: на Android при 90 Гц дисплеї Hero-перехід може виглядати смиканим, якщо не виставлений Choreographer.

Таблиця: Строки виконання та типові сценарії

Задача Час Коментар
Базові екранні переходи та мікроінтеракції 1 тиждень Стандартні gesture-driven sheets, каруселі
Lottie/Rive інтеграція з дизайн-системою 3-5 днів Після отримання фінальних файлів
Кастомна інтерактивність з фізикою (сustom sheet, drawer) 1-2 тижні Включає тестування на 4+ пристроях

Що входить в роботу: анімаційний шар під ключ

  • Інтеграція Lottie/Rive-файлів в дизайн-систему
  • Код gesture-driven переходів (bottom sheets, drawers, каруселі)
  • Тестування на реальних пристроях (iOS, Android)
  • Документація з анімацій (архітектура, ключі станів)
  • Підтримка при оновленні дизайну (гарантія 30 днів)

У нас 5+ років досвіду в мобільній розробці, понад 30 проєктів з анімаціями, сертифіковані iOS/Android розробники. Замовте анімації під ключ — перша консультація безкоштовна. Напишіть нам у месенджер, щоб узгодити деталі.

Apple Developer Documentation – UIKit Animations використовується як базова специфікація.