Rive: คืออะไร, เครื่องมืออนิเมชันสำหรับ Flutter และ iOS

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-01 เวลาอ่าน: 11 นาที

Rive เป็นเครื่องมือสำหรับสร้างและเล่นอนิเมชันเวกเตอร์แบบอินเทอร์แอคทีฟที่รวมโปรแกรมแก้ไขอนิเมชันและไลบรารีรันไทม์สำหรับแพลตฟอร์มมือถือ แตกต่างจากรูปแบบพาสซีฟ Rive รองรับ State Machine — ตรรกะการเปลี่ยนระหว่างอนิเมชันตามการกระทำของผู้ใช้ ตามRive Blog (2026) เครื่องมือนี้ถูกใช้ในกว่า 10,000 โปรเจกต์ รวมถึง Duolingo และ Bumble เรียนรู้เพิ่มเติมเกี่ยวกับอนิเมชันประเภทอื่นได้ในคู่มืออนิเมชันทั่วไป

ประเด็นสำคัญ

  • Rive — เครื่องมือสำหรับอนิเมชันเวกเตอร์แบบอินเทอร์แอคทีฟพร้อมโปรแกรมแก้ไขของตัวเอง
  • State Machine — ตรรกะภาพสำหรับการเปลี่ยนระหว่างอนิเมชันโดยทริกเกอร์
  • RiveRuntime — ไลบรารีการเล่นสำหรับ iOS, Android, Flutter และ Web
  • RiveAnimation — วิดเจ็ต Dart ของ Flutter สำหรับฝังไฟล์ .riv ในแอปพลิเคชัน
  • รูปแบบ .riv — คอนเทนเนอร์ไบนารีที่ประกอบด้วยอนิเมชันและ State Machine

Rive คืออะไร?

Rive (เดิมชื่อ Rive.app, ก่อตั้งในปี 2016) เป็นโปรแกรมแก้ไขกราฟิกและรันไทม์ข้ามแพลตฟอร์มสำหรับอนิเมชันเวกเตอร์แบบอินเทอร์แอคทีฟ แตกต่างจาก After Effects + Bodymovin (Lottie) Rive มีสภาพแวดล้อมแบบรวม: นักออกแบบวาด, ทำอนิเมชัน และกำหนดค่าตรรกะการเปลี่ยนได้โดยตรงในโปรแกรมแก้ไข ผลลัพธ์ถูกส่งออกเป็นไฟล์ .riv ไบนารีที่มีน้ำหนัก 2 ถึง 50 KB ขึ้นอยู่กับความซับซ้อน

ความแตกต่างหลักของ Rive จากโซลูชันอื่นคือ State Machine เป็นกราฟภาพที่โหนดคืออนิเมชัน (Idle, Hover, Press, Active) และการเปลี่ยนระหว่างโหนดถูกเรียกใช้โดยทริกเกอร์ (Touch, Drag, Boolean) นักพัฒนาเพียงส่งทริกเกอร์ในโค้ด และ RiveRuntime ตัดสินใจว่าจะเล่นอนิเมชันใดและจะสลับระหว่างอนิเมชันเหล่านั้นอย่างราบรื่นได้อย่างไร ตามRive Engineering (2026) อนิเมชัน .riv เฉลี่ยกับ State Machine ใช้พื้นที่ 15 KB — เล็กกว่าไฟล์วิดีโอเทียบเท่า 5–10 เท่า

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 vs 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 ไม่ต้องการการนำเข้าแยกต่างหากอีกต่อไป — rive v0.12+ มีฟีเจอร์ทั้งหมด สำหรับอนิเมชันแบบกำหนดเอง ให้ควบคุม RiveAnimationController โดยตรง — ให้การเข้าถึงอนิเมชัน การผสม (blend) และความเร็ว

การรวม Rive ใน iOS (Swift)

ใน iOS RiveRuntime แสดงโดยคลาส RiveView (UIKit) และ RiveViewModel (SwiftUI) ไลบรารีเชื่อมต่อผ่าน Swift Package Manager RiveView เรนเดอร์ไฟล์ .riv ผ่าน Core Graphics และ Metal รองรับ 120 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 กิน CPU น้อยกว่า Lottie บน iOS เนื่องจากการเรนเดอร์ผ่าน Core Graphics สำหรับอนิเมชันใน NavigationView/UICollectionView ให้ใช้การโหลดล่วงหน้าผ่าน RiveFile.preload()

การรวม Rive ใน Android (Kotlin)

ใน Android RiveAnimationView เป็น View หลักสำหรับฝังอนิเมชัน .riv ไลบรารี app.rive:rive-android เชื่อมต่อผ่าน Gradle RiveAnimationView สืบทอดจาก View และเรนเดอร์ผ่าน Canvas ด้วยการสนับสนุนการเร่งด้วยฮาร์ดแวร์ 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 สูงถึง 100 KB ถูกแยกวิเคราะห์ใน 5–10 ms บนอุปกรณ์ระดับกลาง

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) — ค่าที่แนะนำ 100–300 ms เพื่อความลื่นไหล สำหรับสถานะ UI ที่ซับซ้อน ให้ใช้ State Machine แบบซ้อน (Nested State Machines) — แต่ละส่วนของอนิเมชันถูกจัดการอย่างอิสระ Rive State Machine ทำงานบนทุกแพลตฟอร์มโดยไม่เปลี่ยนแปลงไฟล์ .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 Runtime ที่ใช้ร่วมกัน

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 บนอุปกรณ์มือถือได้อย่างไร?

จำกัดจำนวนเลเยอร์ที่ทำงานพร้อมกันที่ 20–30 ใช้ Flat shading แทน Gradient สำหรับรูปร่างที่เรียบง่าย สำหรับอนิเมชันที่มีข้อความ ให้ใช้ System Text (ไม่ใช่ข้อความเวกเตอร์ใน Rive Editor) ลดจำนวน Bone อนิเมชันสำหรับตัวละครให้เหลือน้อยที่สุด — ไม่จำเป็นสำหรับองค์ประกอบ UI บนอุปกรณ์เก่า ให้ปิดการบัฟเฟอร์สองชั้น: riveView.enableDoubleBuffering = false บน Android

สรุป

  • Rive — อนิเมชันเวกเตอร์แบบอินเทอร์แอคทีฟพร้อมโปรแกรมแก้ไขและรันไทม์ของตัวเองสำหรับ 5+ แพลตฟอร์ม
  • State Machine — ตรรกะการเปลี่ยนในตัวระหว่างอนิเมชันโดยทริกเกอร์ (Touch, Boolean, Number)
  • RiveRuntime — ไลบรารีสำหรับ Flutter, iOS, Android, Web และ React พร้อมการเรนเดอร์ผ่าน Skia/Core Graphics
  • รูปแบบ .riv — คอนเทนเนอร์ไบนารีน้ำหนัก 2–50 KB ที่ประกอบด้วยอนิเมชันและ State Machine
  • RiveAnimation (Flutter), RiveViewModel (SwiftUI), RiveAnimationView (Android) — คอมโพเนนต์หลัก
  • Rive เหมาะสำหรับองค์ประกอบ UI แบบอินเทอร์แอคทีฟ, Lottie สำหรับอนิเมชันตกแต่งแบบพาสซีฟ
  • ประเภททริกเกอร์: Boolean (สวิตช์), Number (ตัวเลข), Trigger (ชีพจร) ระยะเวลาการเปลี่ยนที่แนะนำ — 100–300 ms

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม