Rive: wat is het, animatietool voor Flutter en iOS

Auteur: IT Sectr Gepubliceerd: 2026-03-01 Leestijd: 11 min

Rive — een tool voor het maken en afspelen van interactieve vectoranimatie die de animatie-editor en runtime-bibliotheken voor mobiele platforms combineert. In tegenstelling tot passieve formaten ondersteunt Rive State Machine — de logica van overgangen tussen animaties op basis van gebruikersacties. Volgens Rive Blog (2026) wordt de tool gebruikt in meer dan 10.000 projecten, waaronder Duolingo en Bumble. Lees meer over andere animatietypen in de algemene gids voor animatie.

Belangrijkste punten

  • Rive — tool voor interactieve vectoranimatie met eigen editor.
  • State Machine — visuele logica van overgangen tussen animaties via triggers.
  • RiveRuntime — afspeelbibliotheek voor iOS, Android, Flutter en Web.
  • RiveAnimation — Dart-widget voor Flutter voor het inbedden van .riv-bestanden in de app.
  • Formaat .riv — binaire container met animatie en State Machine.

Wat is Rive?

Rive (voorheen Rive.app, opgericht in 2016) — is een grafische editor en cross-platform runtime voor interactieve vectoranimatie. In tegenstelling tot After Effects + Bodymovin (Lottie) biedt Rive een uniforme omgeving: de ontwerper tekent, animeert en configureert de overgangslogica direct in de editor. Het resultaat wordt geëxporteerd naar een binair .riv-bestand dat 2 tot 50 KB weegt, afhankelijk van de complexiteit.

Het belangrijkste verschil van Rive met andere oplossingen — State Machine. Dit is een visuele graaf waarin knooppunten animaties zijn (Idle, Hover, Press, Active) en overgangen ertussen worden geactiveerd door triggers (Touch, Drag, Boolean). De ontwikkelaar stuurt in de code alleen triggers, en RiveRuntime beslist zelf welke animatie wordt afgespeeld en hoe soepel ertussen wordt geschakeld. Volgens Rive Engineering (2026) neemt een gemiddelde .riv-animatie met State Machine 15 KB in beslag — 5–10 keer minder dan een equivalent videobestand.

Rive Runtime is beschikbaar voor Flutter, iOS (Swift), Android (Kotlin/Java), Web (WASM) en React. Rendering gebeurt via Skia (Flutter/Web), Core Graphics (iOS) of Canvas (Android). Rive ondersteunt vormanimatie (Knob, Slider, Button met aangepaste geometrie), waarmee volledig geanimeerde UI-componenten kunnen worden gemaakt, niet alleen decoratieve animaties.

Rive vs Lottie: vergelijking van aanpakken

Rive en Lottie lossen verschillende taken op. Lottie is een speler voor kant-en-klare animaties uit After Effects, optimaal voor passieve decoratieve effecten. Rive is een tool voor het maken van interactieve animaties met eigen logica, waarbij de animatie reageert op gebruikersacties. De keuze hangt af van de vereiste mate van interactiviteit.

CriteriumRiveLottie
EditorEigen (Rive Editor)Adobe After Effects + Bodymovin
InteractiviteitState Machine, triggers, Boolean, NumberAlleen play/pause/seek
Formaat.riv (binair).json of .lottie (protobuf)
RenderingSkia / Core Graphics / CanvasCanvas / Core Animation / Skia
Geanimeerde UIKnob, Slider, Button, Input (ingebouwd)Nee (alleen decoratieve lagen)

Wanneer Rive kiezen: interactieve knoppen met reactie op klik, game-elementen (personages met toestanden), schakelaars met animatie, dynamische pictogrammen die reageren op status. Wanneer Lottie kiezen: preloaders, likes, welkomstschermen, accentanimaties zonder logica. Voor Flutter-projecten is Rive de voorkeurskeuze dankzij native integratie met Skia en de Flutter-renderingpipeline.

Rive integreren in Flutter (Dart)

In Flutter is RiveAnimation de belangrijkste widget voor het inbedden van .riv-bestanden. Het is beschikbaar via het rive-pakket (officieel). RiveAnimation ondersteunt argumenten: artboard (bord selecteren), animation (animatienaam), fit, alignment, controllers (voor State Machine). Voor interactieve scènes wordt StateMachineController gebruikt.

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

// Eenvoudig animatie afspelen
RiveAnimation.asset(
  'assets/animations/button.riv',
  artboard: 'Button',
  animations: const ['idle'],
  fit: BoxFit.contain,
)

// StateMachineController met triggers
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');
          }
        },
      ),
    );
  }
}

Beste Flutter-praktijken: laad .riv-bestanden asynchroon via RiveAnimation.asset (ingebouwde AssetBundle). Gebruik voor ListView één gedeelde StateMachineController tussen elementen. Rive vereist geen aparte import meer — rive v0.12+ bevat alle functies. Voor aangepaste animatie kunt u RiveAnimationController direct aansturen — het biedt toegang tot animaties, blending en snelheid.

Rive integreren in iOS (Swift)

In iOS wordt RiveRuntime vertegenwoordigd door de klasse RiveView (UIKit) en RiveViewModel (SwiftUI). De bibliotheek wordt verbonden via Swift Package Manager. RiveView rendert .riv-bestanden via Core Graphics en Metal en ondersteunt 120 FPS op ProMotion-schermen. Voor State Machine wordt RiveStateMachineLayer gebruikt met koppeling aan triggers.

swift
import RiveRuntime

// SwiftUI: RiveViewModel met animatie
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
                            // Trigger via State Machine
                        }
                    }
                    .onEnded { _ in
                        isPressed = false
                    }
            )
    }
}

// UIKit: RiveView met handmatige bediening
let riveView = RiveView()
riveView.configure(fileName: "loading", extension: "riv")
riveView.fit = .contain
riveView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(riveView)

// State Machine beheer
riveView.triggerInput(named: "startAnimation")

Beste iOS-praktijken: gebruik RiveViewModel voor SwiftUI — het beheert automatisch de levenscyclus. Voor UIKit abonneer je op RiveViewDelegate voor het volgen van gebeurtenissen. Rive verbruikt minder CPU dan Lottie op iOS dankzij rendering via Core Graphics. Gebruik voor animaties in NavigationView/UICollectionView prefetching via RiveFile.preload().

Rive integreren in Android (Kotlin)

In Android is RiveAnimationView de belangrijkste View voor het inbedden van .riv-animaties. De bibliotheek app.rive:rive-android wordt via Gradle verbonden. RiveAnimationView erft van View en rendert via Canvas met ondersteuning voor Hardware Acceleration. State Machine wordt beheerd via setTriggers en 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 beheer
import app.rive.riveandroid.RiveAnimationView
import app.rive.riveandroid.StateMachineInput

val riveView = findViewById<RiveAnimationView>(R.id.riveView)
riveView.post {
    riveView.setTriggers("hover") "> Trigger verzenden naar de State Machine
    riveView.setInput("speed", 1.5f)
    riveView.setInput("isActive", true)
    riveView.play()
}

// Afhandeling van animatievoltooiing
riveView.addListener(object : RiveAnimationView.RiveListener() {
    override fun onAnimationCompleted(animationName: String) {
        Log.d("Rive", "Animation $animationName completed")
    }
})

Beste Android-praktijken: laad .riv-bestanden via res/raw (ingebouwde bronnen) of assets (netwerk laden). RiveAnimationView verwerkt automatisch de levenscyclus — roep play/pause niet handmatig aan in onResume/onPause. Gebruik voor animaties in RecyclerView setOnScrollListener om het afspelen te pauzeren tijdens scrollen. Volgens Rive-documentatie (2026) worden .riv-bestanden tot 100 KB in 5–10 ms geparseerd op middenklasse apparaten.

State Machine: overgangslogica in Rive

State Machine — de belangrijkste functie van Rive die het onderscheidt van passieve animatieformaten. Het is een visuele graaf waarin hoekpunten toestanden (animaties) zijn en randen overgangen die door triggers worden geactiveerd. State Machine wordt gemaakt in Rive Editor: de ontwerper voegt animatieknooppunten toe, verbindt ze met lijnen en wijst triggers toe (Touch, Boolean, Number). De ontwikkelaar hoeft alleen deze triggers vanuit de code te sturen.

dart
// Flutter: volledige controle over 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');
        },
      ),
    );
  }
}

// Numerieke waarde verzenden
SMIInput<double> speedInput = controller.findInput('speed');
speedInput?.value = scrollPosition;

Triggertypes: Boolean — schakelaar (true/false), Number — numerieke waarde (0.0–1.0 of willekeurig bereik), Trigger — eenmalige impuls (knop indrukken). In Rive Editor kunt u overgangsvervaging (Transition Duration) configureren — aanbevolen waarde 100–300 ms voor vloeiendheid. Gebruik voor complexe UI-toestanden geneste State Machines (Nested State Machines) — elk deel van de animatie wordt onafhankelijk beheerd. Rive State Machine werkt op alle platforms zonder wijzigingen in het .riv-bestand — de overgangslogica zit in het bestand, niet in de applicatiecode.

Veelgestelde vragen

Waarin verschilt Rive van Lottie?

Rive — interactieve animatie met State Machine, triggers en eigen editor. Lottie — passief afspelen van JSON-animatie uit After Effects. Rive is geschikt voor knoppen, games en UI-elementen met gebruikersreactie. Lottie — voor decoratieve effecten (preloaders, likes). Rive gebruikt .riv-formaat, Lottie — JSON of .lottie.

Kan Rive zonder State Machine worden gebruikt?

Ja. Rive ondersteunt eenvoudig afspelen van animatie zonder State Machine — specificeer animationName in RiveAnimation.asset of RiveView. In dit geval werkt Rive zoals Lottie: een herhaalde of eenmalige animatie. State Machine is een optionele laag voor interactiviteit. Voor projecten die alleen decoratieve animatie nodig hebben, is State Machine overbodig.

Is Rive compatibel met Android Jetpack Compose?

Ja, via AndroidView voor het inbedden van RiveAnimationView in Compose. Sinds rive-android 0.9.0 is er een Compose-wrapper RiveAnimation compose() met ondersteuning voor modifiers. Gebruik voor State Machine-beheer remember { StateMachineHolder() }. Rive ondersteunt ook Compose Multiplatform op iOS via de gedeelde Compose-runtime.

Werkt Rive op Flutter Web?

Ja, Rive ondersteunt Flutter Web via Skia Wasm (CanvasKit) of HTML-renderer. CanvasKit wordt aanbevolen voor maximale prestaties. Rive-bestanden worden geladen via HTTP-verzoek (RiveAnimation.network) of verpakt in assets. Flutter Web met Rive werkt correct in alle moderne browsers (Chrome 90+, Safari 15+, Firefox 90+).

Hoe optimaliseer ik Rive-prestaties op mobiele apparaten?

Beperk het aantal gelijktijdig actieve lagen tot 20–30. Gebruik Flat shading in plaats van Gradient voor eenvoudige vormen. Gebruik voor animaties met tekst System Text (geen vector tekst in Rive Editor). Minimaliseer het aantal Bone-animaties voor personages — voor UI-elementen zijn ze niet nodig. Schakel op oudere apparaten dubbele buffering uit met riveView.enableDoubleBuffering = false op Android.

Samenvatting

  • Rive — interactieve vectoranimatie met eigen editor en runtime voor 5+ platforms.
  • State Machine — ingebouwde overgangslogica tussen animaties via triggers (Touch, Boolean, Number).
  • RiveRuntime — bibliotheken voor Flutter, iOS, Android, Web en React met rendering via Skia/Core Graphics.
  • Formaat .riv — binaire container van 2–50 KB met animatie en State Machine.
  • RiveAnimation (Flutter), RiveViewModel (SwiftUI), RiveAnimationView (Android) — hoofdcomponenten.
  • Rive is geschikt voor interactieve UI-elementen, Lottie voor passieve decoratieve animaties.
  • Triggertypes: Boolean (schakelaar), Number (getal), Trigger (impuls). Aanbevolen overgangsduur — 100–300 ms.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook