Разработка мобильного приложения с анимациями часто упирается в компромисс: Lottie проста, но неинтерактивна, а кастомная анимация на SwiftUI/Compose — ресурсоёмка. Rive решает эту дилемму: векторные анимации с State Machine реагируют на жесты, данные и бизнес-логику в реальном времени. Мы интегрировали Rive в проекты с высоконагруженными интерфейсами — от фитнес-трекеров до финансовых приложений. Ниже — технические детали, которые помогут избежать типичных ошибок.
Архитектура Rive Runtime
Rive file (.riv) содержит артборды, анимационные клипы и State Machine. Runtime загружает файл, создаёт Artboard инстанс и управляет им через StateMachineController или SimpleAnimation. Рендеринг — через собственный Rive Renderer, который на iOS использует Metal, на Android — OpenGL ES 3.0 / Vulkan.
| Платформа | Рендерер | Минимальная версия | Замечания |
|---|---|---|---|
| Android | OpenGL ES 3.0 / Vulkan (Rive Renderer) | API 18+ | Canvas рендерер (до 9.x) медленнее, но совместимее; Rive Renderer включён по умолчанию с 9.x |
| iOS | Metal | iOS 12+ | Rive Renderer всегда активен |
| Flutter | Skia / Impeller | Dart SDK 2.17+ | Использует собственный плагин rive |
Важный момент: Rive Renderer и стандартный Canvas рендерер существуют параллельно. На Android до версии runtime 9.x по умолчанию использовался Canvas рендерер — медленнее, но совместимее. Начиная с 9.x Rive Renderer включён по умолчанию, и он значительно быстрее на сложных mesh анимациях, но требует OpenGL ES 3.0 (API 18+, что покрывает >99% устройств).
Сравнение Rive и Lottie
| Параметр | Rive | Lottie |
|---|---|---|
| Интерактивность | State Machine, input'ы | Только воспроизведение |
| Формат | .riv (вектор + mesh) |
JSON (Bodymovin) |
| Производительность | Rive Renderer (Metal/GLES) | Quartz2D / Canvas |
| Размер файла | На 30–50% меньше | Больше при complex shapes |
| Поддержка состояний | Да (Boolean, Number, Trigger) | Нет |
Официальная документация Rive подтверждает, что State Machine обеспечивает бесшовные переходы между анимациями.
Интеграция Rive на Android
- Добавьте зависимость в
build.gradle:
implementation "app.rive:rive-android:9.6.0" - Инициализируйте Rive в
Application.onCreate()— обязательно один раз:
RiveInitializer.initializer(context) -
Используйте
RiveAnimationViewв layout или создайте программно. Укажите ресурс.rivфайла и имя State Machine. -
Управляйте input'ами через view:
val riveView = findViewById<RiveAnimationView>(R.id.riveView) riveView.setNumberState("StateMachine", "progress", 0.75f) riveView.setBooleanState("StateMachine", "isActive", true) riveView.fireState("StateMachine", "triggerName") Интеграция Rive на iOS
import RiveRuntime // UIKit let riveView = RiveView() let model = RiveModel(fileName: "my_animation") let viewModel = RiveViewModel(model, stateMachineName: "StateMachine") viewModel.setView(riveView) try? viewModel.setInput("isActive", value: true) try? viewModel.triggerInput("tapTrigger") // SwiftUI struct AnimatedButton: View { @StateObject private var rvm = RiveViewModel(fileName: "button_animation", stateMachineName: "ButtonSM") var body: some View { rvm.view() .onTapGesture { try? rvm.triggerInput("pressed") } } } Интеграция Rive на Flutter
RiveAnimation.asset( 'assets/animations/my_animation.riv', stateMachines: ['StateMachine'], onInit: (artboard) { final controller = StateMachineController.fromArtboard(artboard, 'StateMachine'); artboard.addController(controller!); final isActive = controller.findInput<bool>('isActive') as SMIBool; isActive.value = true; }, ) Почему Rive State Machine эффективнее классических анимаций?
В отличие от линейных анимаций, где последовательность кадров фиксирована, State Machine задаёт логику переходов. Например, в фитнес-приложении анимация прогресса тренировки переключает состояния: ожидание, выполнение, пауза, завершение. Это сократило количество артбордов с 12 до 3, а время отклика анимации на жесты — до 16 мс. Rive поддерживает числовые, булевы и триггерные input'ы, что покрывает 90% сценариев взаимодействия. Результат: сокращение времени разработки анимаций на 40% и снижение нагрузки на CPU/GPU за счёт использования Rive Renderer. Экономия бюджета на анимации достигает 30-50% по сравнению с кастомной реализацией.
Типичные ошибки при интеграции Rive
- Rive file создан под один артборд, а в runtime пытаемся обращаться к другому —
NullPointerException. Всегда указывайте имя артборда через параметрartboardName. - Имена input'ов State Machine чувствительны к регистру и пробелам. «Is Active» и «isActive» — разные inputs. Проверяйте через Rive Editor.
- Большие
.rivфайлы (>5 МБ) с embedded текстурами грузите асинхронно. На iOSRiveModelможно инициализировать сDataобъектом, загруженным в background thread. - На Android не забудьте вызвать
RiveInitializer.initializer()— забывчивость ведёт к крашуIllegalStateException.
Что входит в нашу работу
- Анализ анимационных макетов и проектирование State Machine.
- Настройка интеграции на Android, iOS или Flutter (в зависимости от платформы).
- Оптимизация производительности: выбор правильного рендерера, кэширование файлов.
- Документация по State Machine input'ам и API.
- Обучение команды работе с Rive Editor и runtime.
- Поддержка после внедрения (2 недели гарантийной доработки).
Сроки и стоимость
Интеграция одного Rive file с базовой State Machine — от 4 часов. Если нужна двусторонняя синхронизация с бизнес-логикой (прогресс, состояния авторизации, игровые события) — 1–2 дня. Стоимость рассчитывается индивидуально, зависит от сложности и платформы. Мы имеем 8 лет опыта в мобильной разработке и реализовали более 20 проектов с интеграцией Rive.
Получите консультацию по интеграции Rive — наши инженеры помогут выбрать архитектуру и настроить State Machine под вашу бизнес-логику. Закажите аудит ваших анимаций уже сегодня. Свяжитесь с нами, чтобы обсудить ваш проект.







