Rive: bu nədir, Flutter və iOS üçün animasiya aləti

Müəllif: IT Sectr Dərc olunub: 2026-03-01 Oxuma vaxtı: 11 dəq

Rive — mobil platformalar üçün animasiya redaktoru və icra kitabxanalarını birləşdirən interaktiv vektor animasiyasının yaradılması və oxudulması alətidir. Passiv formatlardan fərqli olaraq, Rive State Machine — istifadəçi hərəkətlərindən asılı olaraq animasiyalar arasında keçid məntiqini dəstəkləyir. Rive Blog (2026) məlumatına görə, alət Duolingo və Bumble də daxil olmaqla 10 000-dən çox layihədə istifadə olunur. Digər animasiya növləri haqqında animasiya üzrə ümumi bələdçidə oxuyun.

Əsas məqamlar

  • Rive — öz redaktoru ilə interaktiv vektor animasiyası aləti.
  • State Machine — triggerlər vasitəsilə animasiyalar arasında keçidlərin vizual məntiqi.
  • RiveRuntime — iOS, Android, Flutter və Web üçün oxutma kitabxanası.
  • RiveAnimation — .riv fayllarını tətbiqə yerləşdirmək üçün Flutter Dart vidjeti.
  • .riv formatı — animasiya və State Machine ehtiva edən ikili konteyner.

Rive nədir?

Rive (əvvəl Rive.app, 2016-cı ildə təsis edilib) — interaktiv vektor animasiyası üçün qrafik redaktor və çoxplatformalı icra mühitidir. After Effects + Bodymovin (Lottie)-dən fərqli olaraq, Rive vahid mühit təqdim edir: dizayner birbaşa redaktorda çəkir, animasiya edir və keçid məntiqini konfiqurasiya edir. Nəticə mürəkkəbliyindən asılı olaraq 2–50 KB arasında olan .riv ikili faylına ixrac edilir.

Rive-in digər həllərdən əsas fərqi — State Machine. Bu, qovşaqların animasiyalar (Idle, Hover, Press, Active), keçidlərin isə triggerlər (Touch, Drag, Boolean) ilə işə düşdüyü vizual qrafdır. Tərtibatçı koddan sadəcə triggerlər göndərir, RiveRuntime isə hansı animasiyanı oynatmağı və onlar arasında necə hamar keçid etməyi özü qərar verir. Rive Engineering (2026) məlumatına görə, State Machine ilə orta .riv animasiyası 15 KB tutur — ekvivalent video fayldan 5–10 dəfə az.

Rive Runtime Flutter, iOS (Swift), Android (Kotlin/Java), Web (WASM) və React üçün mövcuddur. Renderləmə Skia (Flutter/Web), Core Graphics (iOS) və ya Canvas (Android) vasitəsilə həyata keçirilir. Rive formaların animasiyasını (Knob, Slider, fərdi həndəsə ilə Button) dəstəkləyir ki, bu da sadəcə dekorativ animasiyalar deyil, tam animasiyalı UI komponentləri yaratmağa imkan verir.

Rive vs Lottie: yanaşmaların müqayisəsi

Rive və Lottie fərqli vəzifələri həll edir. Lottie — passiv dekorativ effektlər üçün optimal olan After Effects-dən hazır animasiyalar üçün pleyerdir. Rive — animasiyanın istifadəçi hərəkətlərinə reaksiya verdiyi öz məntiqi ilə interaktiv animasiyalar yaratmaq alətidir. Seçim tələb olunan interaktivlik dərəcəsindən asılıdır.

KriteriyaRiveLottie
RedaktorÖz (Rive Editor)Adobe After Effects + Bodymovin
İnteraktivlikState Machine, triggerlər, Boolean, NumberYalnız play/pause/seek
Format.riv (ikili).json və ya .lottie (protobuf)
RenderləməSkia / Core Graphics / CanvasCanvas / Core Animation / Skia
Animasiyalı UIKnob, Slider, Button, Input (daxili)Xeyr (yalnız dekorativ təbəqələr)

Nə vaxt Rive seçməli: klikə reaksiya verən interaktiv düymələr, oyun elementləri (vəziyyətləri olan personajlar), animasiyalı keçidlər, vəziyyətə reaksiya verən dinamik ikonlar. Nə vaxt Lottie seçməli: preloaderlər, bəyənmələr, qarşılama ekranları, məntiqsiz vurğu animasiyaları. Flutter layihələri üçün Rive — Skia və Flutter renderləmə pipeline ilə nativ inteqrasiya sayəsində üstünlük verilən seçimdir.

Rive-in Flutter-ə inteqrasiyası (Dart)

Flutter-də RiveAnimation — .riv fayllarını yerləşdirmək üçün əsas vidjetdir. rive paketi (rəsmi) vasitəsilə mövcuddur. RiveAnimation arqumentləri dəstəkləyir: artboard (lövhə seçimi), animation (animasiya adı), fit, alignment, controllers (State Machine üçün). İnteraktiv səhnələr üçün StateMachineController istifadə olunur.

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

// Sadə animasiya oxutma
RiveAnimation.asset(
  'assets/animations/button.riv',
  artboard: 'Button',
  animations: const ['idle'],
  fit: BoxFit.contain,
)

// StateMachineController triggerlərlə
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 ən yaxşı təcrübələri: .riv fayllarını RiveAnimation.asset (daxili AssetBundle) vasitəsilə asinxron yükləyin. ListView üçün elementlər arasında paylaşılan bir StateMachineController istifadə edin. Rive artıq ayrıca import tələb etmir — rive v0.12+ bütün funksiyaları ehtiva edir. Fərdi animasiya üçün RiveAnimationController-i birbaşa idarə edin — o, animasiyalara, qarışdırmaya (blend) və sürətə giriş təmin edir.

Rive-in iOS-ə inteqrasiyası (Swift)

iOS-də RiveRuntime RiveView (UIKit) və RiveViewModel (SwiftUI) sinifləri ilə təmsil olunur. Kitabxana Swift Package Manager vasitəsilə qoşulur. RiveView .riv fayllarını Core Graphics və Metal vasitəsilə renderləyir, ProMotion displeylərində 120 FPS dəstəkləyir. State Machine üçün triggerlərə bağlanan RiveStateMachineLayer istifadə olunur.

swift
import RiveRuntime

// SwiftUI: RiveViewModel animasiya ilə
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 vasitəsilə trigger
                        }
                    }
                    .onEnded { _ in
                        isPressed = false
                    }
            )
    }
}

// UIKit: RiveView əl ilə idarəetmə
let riveView = RiveView()
riveView.configure(fileName: "loading", extension: "riv")
riveView.fit = .contain
riveView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(riveView)

// State Machine idarəsi
riveView.triggerInput(named: "startAnimation")

iOS ən yaxşı təcrübələri: SwiftUI üçün RiveViewModel istifadə edin — o, həyat dövrünü avtomatik idarə edir. UIKit üçün hadisələri izləmək üçün RiveViewDelegate-ə abunə olun. Rive Core Graphics vasitəsilə renderləmə sayəsində iOS-da Lottie-dən daha az CPU sərf edir. NavigationView/UICollectionView-də animasiyalar üçün RiveFile.preload() vasitəsilə prefetching istifadə edin.

Rive-in Android-ə inteqrasiyası (Kotlin)

Android-də RiveAnimationView — .riv animasiyalarını yerləşdirmək üçün əsas View-dir. app.rive:rive-android kitabxanası Gradle vasitəsilə qoşulur. RiveAnimationView View-dən miras alır və Hardware Acceleration dəstəyi ilə Canvas vasitəsilə renderləyir. State Machine setTriggers və setInputs vasitəsilə idarə olunur.

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 idarəsi
import app.rive.riveandroid.RiveAnimationView
import app.rive.riveandroid.StateMachineInput

val riveView = findViewById<RiveAnimationView>(R.id.riveView)
riveView.post {
    riveView.setTriggers("hover") "> State Machine-ə trigger göndərilməsi
    riveView.setInput("speed", 1.5f)
    riveView.setInput("isActive", true)
    riveView.play()
}

// Animasiyanın tamamlanmasının işlənməsi
riveView.addListener(object : RiveAnimationView.RiveListener() {
    override fun onAnimationCompleted(animationName: String) {
        Log.d("Rive", "Animation $animationName completed")
    }
})

Android ən yaxşı təcrübələri: .riv fayllarını res/raw (daxili resurslar) və ya assets (şəbəkə yükləməsi) vasitəsilə yükləyin. RiveAnimationView lifecycle-i avtomatik idarə edir — əl ilə onResume/onPause-da play/pause çağırmayın. RecyclerView-də animasiyalar üçün sürüşdürmə zamanı oxutmanı dayandırmaq üçün setOnScrollListener istifadə edin. Rive sənədlərinə (2026) görə, 100 KB-a qədər .riv faylları orta seqment cihazlarda 5–10 ms-də təhlil edilir.

State Machine: Rive-də keçid məntiqi

State Machine — Rive-in passiv animasiya formatlarından fərqlənən əsas xüsusiyyətidir. Bu, təpələrin vəziyyətlər (animasiyalar), kənarların isə triggerlərlə aktivləşdirilən keçidlər olduğu vizual qrafdır. State Machine Rive Editor-də yaradılır: dizayner animasiya qovşaqları əlavə edir, onları xətlərlə birləşdirir və triggerlər (Touch, Boolean, Number) təyin edir. Tərtibatçıya yalnız bu triggerləri koddan göndərmək qalır.

dart
// Flutter: State Machine üzərində tam nəzarət
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');
        },
      ),
    );
  }
}

// Rəqəm dəyərinin göndərilməsi
SMIInput<double> speedInput = controller.findInput('speed');
speedInput?.value = scrollPosition;

Trigger növləri: Boolean — açar (true/false), Number — ədədi dəyər (0.0–1.0 və ya ixtiyari diapazon), Trigger — birdəfəlik impuls (düymə basılması). Rive Editor-də keçidlərin hamarlanmasını (Transition Duration) konfiqurasiya etmək olar — hamarlıq üçün tövsiyə olunan dəyər 100–300 ms. Mürəkkəb UI vəziyyətləri üçün iç-içə State Machine (Nested State Machines) istifadə edin — animasiyanın hər bir hissəsi müstəqil idarə olunur. Rive State Machine bütün platformalarda .riv faylında dəyişiklik olmadan işləyir — keçid məntiqi tətbiq kodunda deyil, faylda yerləşir.

Tez-tez verilən suallar

Rive Lottie-dən nə ilə fərqlənir?

Rive — State Machine, triggerlər və öz redaktoru olan interaktiv animasiyadır. Lottie — After Effects-dən JSON animasiyasının passiv oxudulmasıdır. Rive düymələr, oyunlar və istifadəçiyə reaksiya verən UI elementləri üçün uyğundur. Lottie — dekorativ effektlər (preloaderlər, bəyənmələr) üçün. Rive .riv formatından, Lottie isə JSON və ya .lottie formatından istifadə edir.

Rive-dən State Machine olmadan istifadə etmək olar?

Bəli. Rive State Machine olmadan sadə animasiya oxutmanı dəstəkləyir — RiveAnimation.asset və ya RiveView-də animationName təyin edin. Bu halda Rive Lottie kimi işləyir: dövrəli və ya tək animasiya. State Machine — interaktivlik üçün isteğe bağlı təbəqədir. Yalnız dekorativ animasiya tələb edən layihələr üçün State Machine lazımsızdır.

Rive Android Jetpack Compose ilə uyğunmu?

Bəli, AndroidView vasitəsilə RiveAnimationView-i Compose-a yerləşdirmək üçün. rive-android 0.9.0-dan etibarən modifier dəstəyi ilə RiveAnimation compose() Compose qurucusu mövcuddur. State Machine idarəsi üçün remember { StateMachineHolder() } istifadə edin. Rive həmçinin ümumi Compose icra mühiti vasitəsilə iOS-da Compose Multiplatform-ı dəstəkləyir.

Rive Flutter Web-də işləyir?

Bəli, Rive Flutter Web-i Skia Wasm (CanvasKit) və ya HTML renderer vasitəsilə dəstəkləyir. Maksimum performans üçün CanvasKit tövsiyə olunur. Rive faylları HTTP sorğusu (RiveAnimation.network) vasitəsilə yüklənir və ya assets-ə yığılır. Rive ilə Flutter Web bütün müasir brauzerlərdə (Chrome 90+, Safari 15+, Firefox 90+) düzgün işləyir.

Mobil cihazlarda Rive performansını necə optimallaşdırmaq olar?

Eyni vaxtda aktiv təbəqələrin sayını 20–30 ilə məhdudlaşdırın. Sadə fiqurlar üçün Gradient əvəzinə Flat shading istifadə edin. Mətnli animasiyalar üçün System Text (Rive Editor-də vektor mətni yox) istifadə edin. Personajlar üçün Bone animasiyalarının sayını minimuma endirin — UI elementləri üçün onlar lazım deyil. Köhnə cihazlarda Android-də riveView.enableDoubleBuffering = false ilə ikiqat buferləməni söndürün.

Nəticə

  • Rive — 5+ platforma üçün öz redaktoru və icra mühiti olan interaktiv vektor animasiyası.
  • State Machine — triggerlər (Touch, Boolean, Number) vasitəsilə animasiyalar arasında daxili keçid məntiqi.
  • RiveRuntime — Skia/Core Graphics vasitəsilə renderləmə ilə Flutter, iOS, Android, Web və React üçün kitabxanalar.
  • .riv formatı — 2–50 KB ağırlığında animasiya və State Machine ehtiva edən ikili konteyner.
  • RiveAnimation (Flutter), RiveViewModel (SwiftUI), RiveAnimationView (Android) — əsas komponentlər.
  • Rive interaktiv UI elementləri üçün, Lottie passiv dekorativ animasiyalar üçün uyğundur.
  • Trigger növləri: Boolean (açar), Number (rəqəm), Trigger (impuls). Tövsiyə olunan keçid müddəti — 100–300 ms.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun