Rive: چیست، ابزار انیمیشن برای Flutter و iOS

نویسنده: IT Sectr منتشر شده: 2026-03-01 زمان مطالعه: 11 دقیقه

Rive — ابزاری برای ایجاد و پخش انیمیشن برداری تعاملی است که ویرایشگر انیمیشن و کتابخانه‌های زمان اجرا را برای پلتفرم‌های موبایل ترکیب می‌کند. برخلاف فرمت‌های غیرفعال، Rive از State Machine — منطق انتقال بین انیمیشن‌ها بر اساس اقدامات کاربر — پشتیبانی می‌کند. به گفته Rive Blog (2026)، این ابزار در بیش از ۱۰٬۰۰۰ پروژه از جمله Duolingo و Bumble استفاده می‌شود. درباره سایر انواع انیمیشن در راهنمای کلی انیمیشن بخوانید.

نکات اصلی

  • Rive — ابزاری برای انیمیشن برداری تعاملی با ویرایشگر اختصاصی.
  • State Machine — منطق بصری انتقال بین انیمیشن‌ها توسط محرک‌ها.
  • RiveRuntime — کتابخانه پخش برای iOS، Android، Flutter و Web.
  • RiveAnimation — ویجت Dart برای Flutter برای جاسازی فایل‌های .riv در برنامه.
  • فرمت .riv — ظرف باینری حاوی انیمیشن و State Machine.

Rive چیست؟

Rive (قبلاً Rive.app، تأسیس شده در ۲۰۱۶) — یک ویرایشگر گرافیکی و محیط اجرای چندپلتفرمی برای انیمیشن برداری تعاملی است. برخلاف After Effects + Bodymovin (Lottie)، Rive یک محیط یکپارچه ارائه می‌دهد: طراح مستقیماً در ویرایشگر ترسیم، انیمیشن و منطق انتقال را پیکربندی می‌کند. نتیجه به یک فایل باینری .riv صادر می‌شود که بسته به پیچیدگی ۲ تا ۵۰ کیلوبایت وزن دارد.

تفاوت اصلی Rive با سایر راه‌حل‌ها — State Machine است. این یک گراف بصری است که در آن گره‌ها انیمیشن‌ها (Idle, Hover, Press, Active) هستند و انتقال بین آنها توسط محرک‌ها (Touch, Drag, Boolean) فعال می‌شوند. توسعه‌دهنده در کد فقط محرک‌ها را ارسال می‌کند و RiveRuntime خودش تصمیم می‌گیرد کدام انیمیشن را پخش کند و چگونه بین آنها به نرمی سوئیچ کند. به گفته Rive Engineering (2026)، یک انیمیشن .riv متوسط با State Machine ۱۵ کیلوبایت حجم دارد — ۵ تا ۱۰ برابر کمتر از فایل ویدیویی معادل.

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 در مقابل 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
UI متحرکKnob، Slider، Button، Input (داخلی)خیر (فقط لایه‌های تزئینی)

چه زمانی Rive انتخاب کنیم: دکمه‌های تعاملی با واکنش به کلیک، عناصر بازی (شخصیت‌های با حالت)، کلیدهای با انیمیشن، آیکون‌های پویا که به وضعیت واکنش نشان می‌دهند. چه زمانی Lottie انتخاب کنیم: پیش‌بارگذارها، لایک‌ها، صفحات خوش‌آمدگویی، انیمیشن‌های تأکیدی بدون منطق. برای پروژه‌های روی Flutter، Rive به دلیل ادغام بومی با 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 رندر می‌کند و از ۱۲۰ 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 به دلیل رندرینگ از طریق Core Graphics CPU کمتری نسبت به Lottie در iOS مصرف می‌کند. برای انیمیشن‌ها در 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 تا ۱۰۰ کیلوبایت در ۵ تا ۱۰ میلی‌ثانیه در دستگاه‌های میان‌رده تجزیه می‌شوند.

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) را پیکربندی کرد — مقدار توصیه‌شده ۱۰۰ تا ۳۰۰ میلی‌ثانیه برای نرمی. برای حالت‌های پیچیده UI از State Machine تودرتو (Nested State Machines) استفاده کنید — هر بخش از انیمیشن به طور مستقل مدیریت می‌شود. State Machine Rive در همه پلتفرم‌ها بدون تغییر در فایل .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 را در دستگاه‌های موبایل بهینه کنیم؟

تعداد لایه‌های همزمان فعال را به ۲۰ تا ۳۰ محدود کنید. برای اشکال ساده از Flat shading به جای Gradient استفاده کنید. برای انیمیشن‌های دارای متن از System Text (نه متن برداری در Rive Editor) استفاده کنید. تعداد انیمیشن‌های Bone را برای شخصیت‌ها به حداقل برسانید — برای عناصر UI به آنها نیازی نیست. در دستگاه‌های قدیمی، بافرینگ دوگانه را با riveView.enableDoubleBuffering = false در Android غیرفعال کنید.

خلاصه

  • Rive — انیمیشن برداری تعاملی با ویرایشگر اختصاصی و محیط اجرا برای ۵+ پلتفرم.
  • State Machine — منطق داخلی انتقال بین انیمیشن‌ها توسط محرک‌ها (Touch, Boolean, Number).
  • RiveRuntime — کتابخانه‌هایی برای Flutter، iOS، Android، Web و React با رندرینگ از طریق Skia/Core Graphics.
  • فرمت .riv — ظرف باینری ۲ تا ۵۰ کیلوبایت حاوی انیمیشن و State Machine.
  • RiveAnimation (Flutter)، RiveViewModel (SwiftUI)، RiveAnimationView (Android) — اجزای اصلی.
  • Rive برای عناصر تعاملی UI مناسب است، Lottie برای انیمیشن‌های تزئینی غیرفعال.
  • انواع محرک‌ها: Boolean (کلید)، Number (عدد)، Trigger (ضربه). مدت زمان توصیه‌شده انتقال — ۱۰۰ تا ۳۰۰ میلی‌ثانیه.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید