Rive: шта је то, алатка за анимацију за Flutter и iOS

Аутор: IT Sectr Објављено: 2026-03-01 Време читања: 11 мин

Rive — алат за креирање и репродукцију интерактивне векторске анимације који обједињује едитор анимације и рантим библиотеке за мобилне платформе. За разлику од пасивних формата, Rive подржава State Machine — логику прелаза између анимација у зависности од радњи корисника. Према Rive Blog (2026), алат се користи у више од 10 000 пројеката, укључујући Duolingo и Bumble. Више о другим врстама анимације прочитајте у општем водичу за анимацију.

Главне тачке

  • Rive — алат за интерактивну векторску анимацију са сопственим едитором.
  • State Machine — визуелна логика прелаза између анимација помоћу окидача.
  • RiveRuntime — библиотека за репродукцију за iOS, Android, Flutter и Web.
  • RiveAnimation — Dart виџет за Flutter за уграђивање .riv датотека у апликацију.
  • Формат .riv — бинарни контејнер који садржи анимацију и State Machine.

Шта је Rive?

Rive (раније Rive.app, основан 2016) — графички едитор и вишеплатформски рантим за интерактивну векторску анимацију. За разлику од After Effects + Bodymovin (Lottie), Rive пружа јединствено окружење: дизајнер црта, анимира и конфигурише логику прелаза директно у едитору. Резултат се извози у бинарну .riv датотеку која тежи између 2 и 50 KB у зависности од сложености.

Главна разлика Rive у односу на друга решења — State Machine. То је визуелни граф где су чворови анимације (Idle, Hover, Press, Active), а прелази између њих се активирају окидачима (Touch, Drag, Boolean). Програмер у коду само шаље окидаче, а RiveRuntime сам одлучује коју анимацију да репродукује и како да глатко пређе између њих. Према Rive Engineering (2026), просечна .riv анимација са State Machine заузима 15 KB — 5–10 пута мање од еквивалентног видео фајла.

Rive Runtime је доступан за Flutter, iOS (Swift), Android (Kotlin/Java), Web (WASM) и React. Рендеровање се врши путем Skia (Flutter/Web), Core Graphics (iOS) или Canvas (Android). Rive подржава анимацију облика (Knob, Slider, Button са прилагођеном геометријом), што омогућава креирање потпуно анимираних UI компоненти, а не само декоративних анимација.

Rive vs Lottie: поређење приступа

Rive и Lottie решавају различите задатке. Lottie је плејер за готове анимације из After Effects-а, оптималан за пасивне декоративне ефекте. Rive је алат за креирање интерактивних анимација са сопственом логиком, где анимација реагује на радње корисника. Избор зависи од потребног степена интерактивности.

КритеријумRiveLottie
ЕдиторСопствени (Rive Editor)Adobe After Effects + Bodymovin
ИнтерактивностState Machine, окидачи, Boolean, NumberСамо play/pause/seek
Формат.riv (бинаран).json или .lottie (protobuf)
РендеровањеSkia / Core Graphics / CanvasCanvas / Core Animation / Skia
Анимирани UIKnob, Slider, Button, Input (уграђени)Не (само декоративни слојеви)

Када изабрати Rive: интерактивна дугмад са реакцијом на клик, елементи игара (ликови са стањима), прекидачи са анимацијом, динамичке иконе које реагују на стање. Када изабрати Lottie: прелоадери, лајкови, добродошли екрани, акцентне анимације без логике. За пројекте на Flutter-у, Rive је пожељан избор захваљујући native интеграцији са Skia и Flutter-овим рендеровањем.

Интеграција Rive у Flutter (Dart)

На Flutter-у RiveAnimation — главни виџет за уграђивање .riv датотека. Доступан је путем пакета rive (званични). RiveAnimation подржава аргументе: artboard (избор табле), animation (име анимације), fit, alignment, controllers (за State Machine). За интерактивне сцене користи се StateMachineController.

dart
import 'package:rive/rive.dart';

// Једноставна репродукција анимације
RiveAnimation.asset(
  'assets/animations/button.riv',
  artboard: 'Button',
  animations: const ['idle'],
  fit: BoxFit.contain,
)

// StateMachineController са окидачима
class InteractiveButton extends StatefulWidget {
  @override
  State<InteractiveButton> createState() => _InteractiveButtonState();
}

class _InteractiveButtonState extends State<InteractiveButton> {
  StateMachineController? _controller;
  SMIInput<bool>? _isPressed;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTapDown: (_) => _isPressed?.value = true,
      onTapUp: (_) => _isPressed?.value = false,
      child: RiveAnimation.asset(
        'assets/animations/button.riv',
        fit: BoxFit.contain,
        onInit: (artboard) {
          _controller = StateMachineController.fromArtboard(
            artboard, 'State Machine 1',
          );
          if (_controller != null) {
            artboard.addController(_controller!);
            _isPressed = _controller!.findInput<bool>('isPressed');
          }
        },
      ),
    );
  }
}

Најбоље праксе Flutter: учитавајте .riv датотеке асинхроно путем RiveAnimation.asset (уграђени AssetBundle). За ListView користите један StateMachineController дељен између елемената. Rive више не захтева посебан import — rive v0.12+ укључује све функције. За прилагођену анимацију контролишите RiveAnimationController директно — пружа приступ анимацијама, мешању (blend) и брзини.

Интеграција Rive у iOS (Swift)

На iOS-у RiveRuntime је представљен класом RiveView (UIKit) и RiveViewModel (SwiftUI). Библиотека се повезује путем Swift Package Manager-а. RiveView рендерује .riv датотеке путем Core Graphics и Metal-а, подржавајући 120 FPS на ProMotion екранима. За State Machine користи се RiveStateMachineLayer са везивањем за окидаче.

swift
import RiveRuntime

// SwiftUI: RiveViewModel са анимацијом
struct RiveAnimationView: View {
    @State private var isPressed = false

    var body: some View {
        RiveViewModel(fileName: "button").view()
            .frame(width: 200, height: 60)
            .gesture(
                DragGesture(minimumDistance: 0)
                    .onChanged { _ in
                        if !isPressed {
                            isPressed = true
                            // Окидач кроз State Machine
                        }
                    }
                    .onEnded { _ in
                        isPressed = false
                    }
            )
    }
}

// UIKit: RiveView са ручним управљањем
let riveView = RiveView()
riveView.configure(fileName: "loading", extension: "riv")
riveView.fit = .contain
riveView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(riveView)

// Управљање State Machine
riveView.triggerInput(named: "startAnimation")

Најбоље праксе iOS: користите RiveViewModel за SwiftUI — аутоматски управља животним циклусом. За UIKit претплатите се на RiveViewDelegate за праћење догађаја. Rive троши мање CPU-а од Lottie-ја на iOS-у захваљујући рендеровању путем Core Graphics. За анимације у NavigationView/UICollectionView користите преузимање унапред путем RiveFile.preload().

Интеграција Rive у Android (Kotlin)

На Android-у RiveAnimationView — главни View за уграђивање .riv анимација. Библиотека app.rive:rive-android се повезује путем Gradle-а. RiveAnimationView наслеђује View и рендерује путем Canvas-а са подршком за Hardware Acceleration. State Machine се управља путем setTriggers и setInputs.

kotlin
// build.gradle.kts
implementation("app.rive:rive-android:0.9.0")

// XML layout
<app.rive.RiveAnimationView
    android:id="@+id/riveView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:rive_file="@raw/mascot"
    app:rive_artboard="Mascot"
    app:rive_animation="idle" />

// Kotlin: управљање State Machine
import app.rive.riveandroid.RiveAnimationView
import app.rive.riveandroid.StateMachineInput

val riveView = findViewById<RiveAnimationView>(R.id.riveView)
riveView.post {
    riveView.setTriggers("hover") "> Отправка триггера в State Machine
    riveView.setInput("speed", 1.5f)
    riveView.setInput("isActive", true)
    riveView.play()
}

// Обрада завршетка анимације
riveView.addListener(object : RiveAnimationView.RiveListener() {
    override fun onAnimationCompleted(animationName: String) {
        Log.d("Rive", "Animation $animationName completed")
    }
})

Најбоље праксе Android: учитавајте .riv датотеке путем res/raw (уграђени ресурси) или assets (учитавање преко мреже). RiveAnimationView аутоматски обрађује животни циклус — не позивајте play/pause у onResume/onPause ручно. За анимације у RecyclerView користите setOnScrollListener за паузирање репродукције приликом скроловања. Према Rive документацији (2026), .riv датотеке до 100 KB се парсирају за 5–10 ms на уређајима средњег сегмента.

State Machine: логика прелаза у Rive-у

State Machine — кључна могућност Rive-а која га разликује од пасивних формата анимације. То је визуелни граф где су врхови стања (анимације), а ивице прелази активирани окидачима. State Machine се креира у Rive Editor-у: дизајнер додаје чворове анимација, повезује их линијама и додељује окидаче (Touch, Boolean, Number). Програмеру остаје само да шаље ове окидаче из кода.

dart
// Flutter: потпуна контрола над State Machine
import 'package:rive/rive.dart';

class RiveStateMachineWidget extends StatefulWidget {
  @override
  State<RiveStateMachineWidget> createState() => _RiveStateMachineWidgetState();
}

class _RiveStateMachineWidgetState extends State<RiveStateMachineWidget> {
  Artboard? _artboard;
  StateMachineController? _controller;
  SMIInput<bool>? _isHovered;
  SMIInput<double>? _progress;

  @override
  Widget build(BuildContext context) {
    return MouseRegion(
      onEnter: (_) => _isHovered?.value = true,
      onExit: (_) => _isHovered?.value = false,
      child: RiveAnimation.asset(
        'assets/interactive_icon.riv',
        onInit: (artboard) {
          _controller = StateMachineController.fromArtboard(
            artboard, 'State Machine 1',
          );
          artboard.addController(_controller!);
          _isHovered = _controller!.findInput<bool>('isHovered');
          _progress = _controller!.findInput<double>('progress');
        },
      ),
    );
  }
}

// Слање нумеричке вредности
SMIInput<double> speedInput = controller.findInput('speed');
speedInput?.value = scrollPosition;

Типови окидача: Boolean — прекидач (true/false), Number — нумеричка вредност (0.0–1.0 или произвољан опсег), Trigger — једнократни импулс (притисак дугмета). У Rive Editor-у се може подесити заглађивање прелаза (Transition Duration) — препоручена вредност 100–300 ms за глаткоћу. За сложена UI стања користите угњеждене State Machine (Nested State Machines) — сваки део анимације се управља независно. Rive State Machine ради на свим платформама без промена у .riv датотеци — логика прелаза је уграђена у датотеку, а не у код апликације.

Често постављана питања

По чему се Rive разликује од Lottie-ја?

Rive — интерактивна анимација са State Machine, окидачима и сопственим едитором. Lottie — пасивна репродукција JSON анимације из After Effects-а. Rive је погодан за дугмад, игре и UI елементе са реакцијом на корисника. Lottie — за декоративне ефекте (прелоадери, лајкови). Rive користи .riv формат, Lottie — JSON или .lottie.

Може ли се Rive користити без State Machine?

Да. Rive подржава једноставну репродукцију анимације без State Machine — наведите animationName у RiveAnimation.asset или RiveView. У овом случају Rive ради као Lottie: петљана или једнократна анимација. State Machine — опциони слој за интерактивност. За пројекте којима је потребна само декоративна анимација, State Machine је сувишна.

Да ли је Rive компатибилан са Android Jetpack Compose?

Да, путем AndroidView за уграђивање RiveAnimationView у Compose. Од rive-android 0.9.0 доступан је Compose омотач RiveAnimation compose() са подршком за модификаторе. За управљање State Machine користите remember { StateMachineHolder() }. Rive такође подржава Compose Multiplatform на iOS-у путем заједничког Compose рантима.

Да ли Rive ради на Flutter Web-у?

Да, Rive подржава Flutter Web путем Skia Wasm (CanvasKit) или HTML рендеровања. Препоручује се CanvasKit за максималне перформансе. Rive датотеке се учитавају путем HTTP захтева (RiveAnimation.network) или се пакују у assets. Flutter Web са Rive-ом ради исправно у свим модерним прегледачима (Chrome 90+, Safari 15+, Firefox 90+).

Како оптимизовати перформансе Rive-а на мобилним уређајима?

Ограничите број истовремено активних слојева на 20–30. Користите Flat shading уместо Gradient за једноставне облике. За анимације са текстом користите System Text (не векторски текст у Rive Editor-у). Минимизирајте број Bone анимација за ликове — за UI елементе нису потребне. На старијим уређајима искључите двоструко баферовање riveView.enableDoubleBuffering = false на Android-у.

Резиме

  • Rive — интерактивна векторска анимација са сопственим едитором и рантимом за 5+ платформи.
  • State Machine — уграђена логика прелаза између анимација помоћу окидача (Touch, Boolean, Number).
  • RiveRuntime — библиотеке за Flutter, iOS, Android, Web и React са рендеровањем путем Skia/Core Graphics.
  • Формат .riv — бинарни контејнер тежине 2–50 KB који садржи анимацију и State Machine.
  • RiveAnimation (Flutter), RiveViewModel (SwiftUI), RiveAnimationView (Android) — главне компоненте.
  • Rive је погодан за интерактивне UI елементе, Lottie — за пасивне декоративне анимације.
  • Типови окидача: Boolean (прекидач), Number (број), Trigger (импулс). Препоручено трајање прелаза — 100–300 ms.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође