Rive: vad är det, animationsverktyg för Flutter och iOS

Författare: IT Sectr Publicerad: 2026-03-01 Lästid: 11 min

Rive — ett verktyg för att skapa och spela upp interaktiv vektoranimation som kombinerar animationsredigeraren och runtime-bibliotek för mobila plattformar. Till skillnad från passiva format stöder Rive State Machine — logik för övergångar mellan animationer baserat på användaråtgärder. Enligt Rive Blog (2026) används verktyget i över 10 000 projekt, inklusive Duolingo och Bumble. Läs mer om andra animationstyper i allmänna guiden om animation.

Huvudpunkter

  • Rive — verktyg för interaktiv vektoranimation med egen redigerare.
  • State Machine — visuell logik för övergångar mellan animationer via utlösare.
  • RiveRuntime — uppspelningsbibliotek för iOS, Android, Flutter och Web.
  • RiveAnimation — Dart-widget för Flutter för att bädda in .riv-filer i appen.
  • Format .riv — binär behållare som innehåller animation och State Machine.

Vad är Rive?

Rive (tidigare Rive.app, grundat 2016) — är en grafisk redigerare och plattformsoberoende runtime för interaktiv vektoranimation. Till skillnad från After Effects + Bodymovin (Lottie) tillhandahåller Rive en enhetlig miljö: designern ritar, animerar och konfigurerar övergångslogik direkt i redigeraren. Resultatet exporteras till en binär .riv-fil som väger 2 till 50 KB beroende på komplexitet.

Den största skillnaden med Rive jämfört med andra lösningar — State Machine. Det är en visuell graf där noder är animationer (Idle, Hover, Press, Active) och övergångarna mellan dem aktiveras av triggers (Touch, Drag, Boolean). Utvecklaren skickar bara triggers i koden och RiveRuntime bestämmer själv vilken animation som ska spelas och hur man smidigt växlar mellan dem. Enligt Rive Engineering (2026) tar en genomsnittlig .riv-animation med State Machine 15 KB — 5–10 gånger mindre än en motsvarande videofil.

Rive Runtime finns tillgängligt för Flutter, iOS (Swift), Android (Kotlin/Java), Web (WASM) och React. Rendering sker via Skia (Flutter/Web), Core Graphics (iOS) eller Canvas (Android). Rive stöder formanimation (Knob, Slider, Button med anpassad geometri), vilket möjliggör skapandet av fullt animerade UI-komponenter, inte bara dekorativa animationer.

Rive vs Lottie: jämförelse av tillvägagångssätt

Rive och Lottie löser olika uppgifter. Lottie är en spelare för färdiga animationer från After Effects, optimal för passiva dekorativa effekter. Rive är ett verktyg för att skapa interaktiva animationer med egen logik, där animationen reagerar på användaråtgärder. Valet beror på önskad grad av interaktivitet.

KriteriumRiveLottie
RedigerareEgen (Rive Editor)Adobe After Effects + Bodymovin
InteraktivitetState Machine, triggers, Boolean, NumberEndast play/pause/seek
Format.riv (binär).json eller .lottie (protobuf)
RenderingSkia / Core Graphics / CanvasCanvas / Core Animation / Skia
Animerat UIKnob, Slider, Button, Input (inbyggda)Nej (endast dekorativa lager)

När du väljer Rive: interaktiva knappar med svar på klick, spelelement (karaktärer med tillstånd), växlar med animation, dynamiska ikoner som reagerar på tillstånd. När du väljer Lottie: förladdare, gilla-markeringar, välkomstskärmar, accentanimationer utan logik. För Flutter-projekt är Rive det föredragna valet tack vare native integration med Skia och Fluters renderingspipeline.

Integrering av Rive i Flutter (Dart)

I Flutter är RiveAnimation den huvudsakliga widgeten för att bädda in .riv-filer. Den är tillgänglig via paketet rive (officiellt). RiveAnimation stöder argument: artboard (val av arbetsyta), animation (animationsnamn), fit, alignment, controllers (för State Machine). För interaktiva scener används StateMachineController.

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

// Enkel uppspelning av animation
RiveAnimation.asset(
  'assets/animations/button.riv',
  artboard: 'Button',
  animations: const ['idle'],
  fit: BoxFit.contain,
)

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

Bästa praxis Flutter: ladda .riv-filer asynkront via RiveAnimation.asset (inbyggd AssetBundle). För ListView, använd en StateMachineController som delas mellan element. Rive kräver inte längre separat import — rive v0.12+ innehåller alla funktioner. För anpassad animation, styr RiveAnimationController direkt — den ger tillgång till animationer, blandning (blend) och hastighet.

Integrering av Rive i iOS (Swift)

I iOS representeras RiveRuntime av klassen RiveView (UIKit) och RiveViewModel (SwiftUI). Biblioteket ansluts via Swift Package Manager. RiveView renderar .riv-filer via Core Graphics och Metal och stöder 120 FPS på ProMotion-skärmar. För State Machine används RiveStateMachineLayer med koppling till triggers.

swift
import RiveRuntime

// SwiftUI: RiveViewModel med animation
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 med manuell kontroll
let riveView = RiveView()
riveView.configure(fileName: "loading", extension: "riv")
riveView.fit = .contain
riveView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(riveView)

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

Bästa praxis iOS: använd RiveViewModel för SwiftUI — den hanterar livscykeln automatiskt. För UIKit, prenumerera på RiveViewDelegate för att spåra händelser. Rive förbrukar mindre CPU än Lottie på iOS tack vare rendering via Core Graphics. För animationer i NavigationView/UICollectionView, använd förhämtning via RiveFile.preload().

Integrering av Rive i Android (Kotlin)

I Android är RiveAnimationView den huvudsakliga vyn för att bädda in .riv-animationer. Biblioteket app.rive:rive-android ansluts via Gradle. RiveAnimationView ärver från View och renderar via Canvas med stöd för Hardware Acceleration. State Machine hanteras via setTriggers och 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-hantering
import app.rive.riveandroid.RiveAnimationView
import app.rive.riveandroid.StateMachineInput

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

// Hantering av animatonsslutförande
riveView.addListener(object : RiveAnimationView.RiveListener() {
    override fun onAnimationCompleted(animationName: String) {
        Log.d("Rive", "Animation $animationName completed")
    }
})

Bästa praxis Android: ladda .riv-filer via res/raw (inbyggda resurser) eller assets (nätverksladdning). RiveAnimationView hanterar automatiskt livscykeln — anropa inte play/pause manuellt i onResume/onPause. För animationer i RecyclerView, använd setOnScrollListener för att pausa uppspelning vid scrollning. Enligt Rive-dokumentation (2026) analyseras .riv-filer upp till 100 KB på 5–10 ms på medelklass-enheter.

State Machine: övergångslogik i Rive

State Machine — den viktigaste funktionen i Rive som skiljer det från passiva animationsformat. Det är en visuell graf där hörn är tillstånd (animationer) och kanter är övergångar som aktiveras av triggers. State Machine skapas i Rive Editor: designern lägger till animationsnoder, kopplar ihop dem med linjer och tilldelar triggers (Touch, Boolean, Number). Utvecklaren behöver bara skicka dessa triggers från koden.

dart
// Flutter: full kontroll över 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');
        },
      ),
    );
  }
}

// Skicka numeriskt värde
SMIInput<double> speedInput = controller.findInput('speed');
speedInput?.value = scrollPosition;

Triggetyper: Boolean — omkopplare (true/false), Number — numeriskt värde (0.0–1.0 eller godtyckligt intervall), Trigger — engångsimpuls (knapptryckning). I Rive Editor kan du konfigurera utjämning av övergångar (Transition Duration) — rekommenderat värde 100–300 ms för jämnhet. För komplexa UI-tillstånd, använd nästlade State Machines (Nested State Machines) — varje del av animationen hanteras oberoende. Rive State Machine fungerar på alla plattformar utan ändringar i .riv-filen — övergångslogiken är inbäddad i filen, inte i applikationskoden.

Vanliga frågor

Vad skiljer Rive från Lottie?

Rive — interaktiv animation med State Machine, triggers och egen redigerare. Lottie — passiv uppspelning av JSON-animation från After Effects. Rive passar för knappar, spel och UI-element med användarrespons. Lottie — för dekorativa effekter (förladdare, gilla-markeringar). Rive använder .riv-format, Lottie — JSON eller .lottie.

Kan Rive användas utan State Machine?

Ja. Rive stöder enkel uppspelning av animation utan State Machine — ange animationName i RiveAnimation.asset eller RiveView. I detta fall fungerar Rive som Lottie: loopad eller engångsanimation. State Machine är ett valfritt lager för interaktivitet. För projekt som bara behöver dekorativ animation är State Machine överflödig.

Är Rive kompatibelt med Android Jetpack Compose?

Ja, via AndroidView för att bädda in RiveAnimationView i Compose. Från och med rive-android 0.9.0 finns ett Compose-omslag RiveAnimation compose() med stöd för modifierare. För State Machine-hantering, använd remember { StateMachineHolder() }. Rive stöder även Compose Multiplatform på iOS via den delade Compose-runtimen.

Fungerar Rive på Flutter Web?

Ja, Rive stöder Flutter Web via Skia Wasm (CanvasKit) eller HTML-renderare. CanvasKit rekommenderas för maximal prestanda. Rive-filer laddas via HTTP-förfrågan (RiveAnimation.network) eller paketeras i assets. Flutter Web med Rive fungerar korrekt i alla moderna webbläsare (Chrome 90+, Safari 15+, Firefox 90+).

Hur optimerar man Rive-prestanda på mobila enheter?

Begränsa antalet samtidigt aktiva lager till 20–30. Använd Flat shading istället för Gradient för enkla former. För animationer med text, använd System Text (inte vektortext i Rive Editor). Minimera antalet Bone-animationer för karaktärer — för UI-element behövs de inte. På äldre enheter, inaktivera dubbelbuffring med riveView.enableDoubleBuffering = false på Android.

Sammanfattning

  • Rive — interaktiv vektoranimation med egen redigerare och runtime för 5+ plattformar.
  • State Machine — inbyggd övergångslogik mellan animationer via triggers (Touch, Boolean, Number).
  • RiveRuntime — bibliotek för Flutter, iOS, Android, Web och React med rendering via Skia/Core Graphics.
  • Format .riv — binär behållare på 2–50 KB som innehåller animation och State Machine.
  • RiveAnimation (Flutter), RiveViewModel (SwiftUI), RiveAnimationView (Android) — huvudkomponenter.
  • Rive passar för interaktiva UI-element, Lottie för passiva dekorativa animationer.
  • Triggetyper: Boolean (omkopplare), Number (tal), Trigger (impuls). Rekommenderad övergångstid — 100–300 ms.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också