פיתוח אפליקציית מובייל עם אנימציות כרוך פעמים רבות בפשרה: Lottie פשוטה אך אינה אינטראקטיבית, בעוד אנימציות מותאמות אישית ב-SwiftUI/Compose כבדות על המשאבים. Rive פותרת זאת: אנימציות וקטוריות עם State Machine מגיבות למחוות, נתונים ולוגיקה עסקית בזמן אמת. שילבנו את Rive בפרויקטים עם ממשקים בעלי עומס גבוה — ממעקבי כושר ועד אפליקציות פיננסיות. להלן הפרטים הטכניים כדי להימנע ממלכודות נפוצות.
ארכיטקטורת Rive Runtime
קובץ Rive (.riv) מכיל artboards, קליפי אנימציה ו-State Machine. ה-runtime טוען את הקובץ, יוצר מופע Artboard ומנהל אותו באמצעות StateMachineController או SimpleAnimation. העיבוד משתמש ב-Rive Renderer הקנייני, שב-iOS משתמש ב-Metal, וב-Android ב-OpenGL ES 3.0 / Vulkan.
| פלטפורמה | מנוע עיבוד | גרסה מינימלית | הערות |
|---|---|---|---|
| Android | OpenGL ES 3.0 / Vulkan (Rive Renderer) | API 18+ | מנוע ה-Canvas (לפני גרסה 9.x) איטי יותר אך תואם יותר; Rive Renderer הוא ברירת המחדל מגרסה 9.x |
| iOS | Metal | iOS 12+ | Rive Renderer פעיל תמיד |
| Flutter | Skia / Impeller | Dart SDK 2.17+ | משתמש בתוסף rive מותאם אישית |
נקודה חשובה: Rive Renderer ומנוע ה-Canvas הסטנדרטי מתקיימים במקביל. ב-Android לפני runtime 9.x, מנוע ה-Canvas היה ברירת המחדל — איטי יותר אך תואם יותר. מגרסה 9.x, Rive Renderer הוא ברירת המחדל ומהיר משמעותית באנימציות mesh מורכבות, אך דורש OpenGL ES 3.0 (API 18+, המכסה >99% מהמכשירים).
Rive לעומת Lottie
| פרמטר | Rive | Lottie |
|---|---|---|
| אינטראקטיביות | State Machine, קלטים | הפעלה בלבד |
| פורמט | .riv (וקטור + mesh) |
JSON (Bodymovin) |
| ביצועים | Rive Renderer (Metal/GLES) | Quartz2D / Canvas |
| גודל קובץ | קטן ב-30–50% | גדול יותר לצורות מורכבות |
| תמיכה במצבים | כן (Boolean, Number, Trigger) | לא |
התיעוד הרשמי של Rive מאשר ש-State Machine מספק מעברים חלקים בין אנימציות.
שילוב Rive ב-Android
- הוספת תלות ב-
build.gradle:
implementation "app.rive:rive-android:9.6.0" - אתחול Rive ב-
implementation "app.rive:rive-android:9.6.0"— יש לקרוא פעם אחת בלבד:
RiveInitializer.initializer(context) -
השתמשו ב-
Application.onCreate()בפריסה או צרו אותו תוכניתית. הפנו למשאב הקובץRiveInitializer.initializer(context)ולשם ה-State Machine. -
ניהול קלטים דרך התצוגה:
val riveView = findViewById<RiveAnimationView>(R.id.riveView)
riveView.setNumberState("StateMachine", "progress", 0.75f)
riveView.setBooleanState("StateMachine", "isActive", true)
riveView.fireState("StateMachine", "triggerName") שילוב Rive ב-iOS
import RiveRuntime
// UIKit
let riveView = RiveView()
let model = RiveModel(fileName: "my_animation")
let viewModel = RiveViewModel(model, stateMachineName: "StateMachine")
viewModel.setView(riveView)
try? viewModel.setInput("isActive", value: true)
try? viewModel.triggerInput("tapTrigger")
// SwiftUI
struct AnimatedButton: View {
@StateObject private var rvm = RiveViewModel(fileName: "button_animation", stateMachineName: "ButtonSM")
var body: some View {
rvm.view()
.onTapGesture {
try? rvm.triggerInput("pressed")
}
}
} שילוב Rive ב-Flutter
RiveAnimation.asset(
'assets/animations/my_animation.riv',
stateMachines: ['StateMachine'],
onInit: (artboard) {
final controller = StateMachineController.fromArtboard(artboard, 'StateMachine');
artboard.addController(controller!);
final isActive = controller.findInput<bool>('isActive') as SMIBool;
isActive.value = true;
},
) מדוע Rive State Machine עדיף על אנימציות קלאסיות
בניגוד לאנימציות ליניאריות עם רצף פריימים קבוע, ה-State Machine מגדיר לוגיקת מעברים. לדוגמה, באפליקציית כושר, אנימציית התקדמות אימון מחליפה מצבים: ממתין, פעיל, הושלם, מושהה. זה צמצם את מספר ה-artboards מ-12 ל-3, וזמן התגובה של האנימציה למחוות ירד ל-16 אלפיות השנייה. Rive תומך בקלטים מספריים, בוליאניים ו-Trigger, המכסים 90% מתרחישי האינטראקציה. התוצאה: הפחתה של 40% בזמן פיתוח האנימציות ועומס נמוך יותר על CPU/GPU בזכות Rive Renderer. החיסכון בתקציב האנימציות מגיע ל-30–50% בהשוואה ליישום מותאם אישית.
טעויות נפוצות בשילוב Rive
- קובץ Rive נוצר עבור artboard אחד אך ה-runtime מנסה לגשת לאחר —
RiveAnimationView. תמיד ציינו את שם ה-artboard דרך פרמטר.riv. - שמות הקלטים ב-State Machine רגישים לאותיות ולרווחים. "Is Active" ו-"isActive" הם קלטים שונים. יש לוודא בעורך Rive.
- קבצי
val riveView = findViewById<RiveAnimationView>(R.id.riveView) riveView.setNumberState("StateMachine", "progress", 0.75f) riveView.setBooleanState("StateMachine", "isActive", true) riveView.fireState("StateMachine", "triggerName")גדולים (>5 MB) עם טקסטורות מוטמעות יש לטעון באופן אסינכרוני. ב-iOS, ניתן לאתחלimport RiveRuntime // UIKit let riveView = RiveView() let model = RiveModel(fileName: "my_animation") let viewModel = RiveViewModel(model, stateMachineName: "StateMachine") viewModel.setView(riveView) try? viewModel.setInput("isActive", value: true) try? viewModel.triggerInput("tapTrigger") // SwiftUI struct AnimatedButton: View { @StateObject private var rvm = RiveViewModel(fileName: "button_animation", stateMachineName: "ButtonSM") var body: some View { rvm.view() .onTapGesture { try? rvm.triggerInput("pressed") } } }עם אובייקטRiveAnimation.asset( 'assets/animations/my_animation.riv', stateMachines: ['StateMachine'], onInit: (artboard) { final controller = StateMachineController.fromArtboard(artboard, 'StateMachine'); artboard.addController(controller!); final isActive = controller.findInput<bool>('isActive') as SMIBool; isActive.value = true; }, )שנטען ברקע. - ב-Android, אל תשכחו לקרוא ל-
NullPointerException— שכחה מובילה לקריסתartboardName.
מה כוללת העבודה שלנו
- ניתוח פריסות אנימציה ועיצוב State Machine.
- הגדרת שילוב ב-Android, iOS או Flutter (בהתאם לפלטפורמה).
- אופטימיזציית ביצועים: בחירת מנוע עיבוד מתאים, שמירת קבצים במטמון.
- תיעוד קלטי State Machine ו-API.
- הדרכת צוות בעורך Rive וב-runtime.
- תמיכה לאחר השקה (שבועיים תיקוני אחריות).
לוחות זמנים ועלות
שילוב קובץ Rive אחד עם State Machine בסיסי — החל מ-4 שעות. אם נדרש סנכרון דו-כיווני עם לוגיקה עסקית (התקדמות, מצבי התחברות, אירועי משחק) — 1–2 ימים. העלות מחושבת באופן אישי, בהתאם למורכבות ולפלטפורמה. יש לנו 8 שנות ניסיון בפיתוח מובייל והעברנו מעל 20 פרויקטים עם שילוב Rive.
קבלו ייעוץ על שילוב Rive — המהנדסים שלנו יעזרו לבחור את הארכיטקטורה ולהגדיר את ה-State Machine ללוגיקה העסקית שלכם. הזמינו ביקורת על האנימציות שלכם עוד היום. צרו קשר כדי לדון בפרויקט שלכם.







