Skip to main content
ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Try for free in your browser →
LanguageEnglish
Mobile Motion Guide8 min read·By the ExodeUI team

Driving 120 FPS Spring Physics in React Native and Flutter with Open Vector Files

Master 120 FPS spring physics in React Native and Flutter. Use open .exode vector files to eliminate JS bridge bottlenecks and achieve buttery-smooth touch interactions.

Direct Summary & Definition

Core Takeaway

Achieving consistent 120 FPS mobile animations requires bypassing JavaScript bridge serialization and garbage collection pauses. ExodeUI's native runtimes for React Native and Flutter evaluate spring physics and state transitions directly on the native rendering layer, keeping touch gestures locked to user fingers without frame drops.

The 120 Hz ProMotion Mobile Challenge

High-refresh mobile displays (Apple ProMotion 120 Hz and Android 120 Hz LTPO) give apps just 8.33 milliseconds per frame. In React Native and Flutter, traditional animation approaches that recalculate styles in JavaScript or rebuild widget trees trigger garbage collection pauses that drop frames, creating noticeable micro-stutter.

  • 8.33ms budget: Doubling framerate from 60 to 120 FPS cuts available CPU time in half.
  • Bridge latency: Passing gesture delta coordinates back and forth over a bridge delays visual updates.
  • Thread decoupling: Animation math must run entirely on the UI rendering thread.

How ExodeUI Evaluates Springs Natively

ExodeUI's mobile packages (exodeui_react_native and exodeui_flutter) load the vector geometry directly into the native GPU canvas (Metal on iOS, Vulkan/Skia/Impeller on Android). Spring differential equations calculate delta velocity frame-by-frame without round-tripping to JavaScript, guaranteeing lag-free response.

Implementation Example in Flutter & React Native

Using ExodeUI in your mobile codebase requires minimal boilerplate. Pass reactive variables into the canvas widget, and let the native physics engine handle the rest.

Production Implementation Snippet

Interactive Component Implementation
import 'package:flutter/material.dart';
import 'package:exodeui_flutter/exodeui_flutter.dart';

class SpringCardWidget extends StatefulWidget {
  const SpringCardWidget({super.key});

  @override
  State<SpringCardWidget> createState() => _SpringCardWidgetState();
}

class _SpringCardWidgetState extends State<SpringCardWidget> {
  bool _isExpanded = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => setState(() => _isExpanded = !_isExpanded),
      child: ExodeUICanvas(
        asset: 'assets/motion/expandable_card.exode',
        inputs: {'expanded': _isExpanded},
        width: 320,
        height: 180,
      ),
    );
  }
}

Frequently Asked Questions

Related Guides & Examples

Design interactive UI once. Ship the same file.

Build states, spring physics and logic visually in ExodeUI, and play the same file in React, SwiftUI, Flutter and more. Free to start.

Try for free