Skip to main content
react-native-ease and react-native-reanimated solve different problems. Choosing the right tool depends on what kind of animation you need.

When to use react-native-ease

  • Fade / slide / scale on state change ✅ — Toggle visibility, animate cards in and out, react to boolean state
  • Enter / exit animations ✅ — Views fade or slide in on mount using initialAnimate
  • Simple declarative animations tied to state ✅ — Set target values, get native motion

When to use Reanimated

  • Gesture-driven animations (pan, pinch) ✅ — Use react-native-gesture-handler with Reanimated shared values
  • Layout animations (width, height) ✅ — Animating layout properties that require recalculation
  • Complex interpolations and chaining ✅ — useAnimatedStyle, withSequence, withDelay chains
  • Shared element transitions ✅ — Cross-screen element continuity via Reanimated or React Navigation
  • Animation worklets and shared values across components ✅ — Cross-component coordinated animation

Comparison table

Use caseEaseReanimated
Fade/slide/scale on state change
Enter/exit animations
Simple declarative animations tied to state
Gesture-driven animations (pan, pinch)
Layout animations (width, height)
Complex interpolations & chaining
Shared element transitions
Animation worklets, shared values across components

The key architectural difference

Both libraries aim to keep animations off the main JS thread, but they achieve this in fundamentally different ways. react-native-ease has zero JS involvement during animation. Once the native side receives the new target values, the animation runs entirely inside the platform — no JS callbacks, no prop updates, no re-renders. On iOS, Core Animation runs in a separate render server process (not even on the main thread). On Android, ObjectAnimator and SpringAnimation run on the UI thread, but they are considerably lighter-weight than Reanimated worklets. Reanimated runs animation worklets on a separate JS thread (its own JS runtime). This gives it the flexibility to respond to shared value changes, run complex interpolation logic, and coordinate animations across components — but it still involves a runtime per frame.

Performance comparison

The example app includes a benchmark measuring per-frame animation overhead when animating translateX on a configurable number of views simultaneously (linear, 2s loop).

Android

UI thread time per frame: anim + layout + draw (ms). Lower is better.

10 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.211.150.750.990.450.36
P950.331.701.531.440.800.62
P990.481.942.261.621.350.98

100 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.362.711.812.191.010.71
P950.563.092.292.671.911.08
P990.713.202.632.972.251.36

500 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.608.315.375.502.371.60
P950.759.266.366.342.861.88
P990.879.596.896.883.223.84

iOS

Display link callback time per frame (ms). Lower is better.

10 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.011.331.081.060.630.83
P950.021.671.591.341.011.18
P990.031.901.681.501.081.31

100 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.013.723.332.712.483.32
P950.015.214.503.833.394.28
P990.025.684.754.913.794.55

500 views

MetricEaseReanimated SVReanimated SV (FF)Reanimated CSSReanimated CSS (FF)RN Animated
Avg0.016.846.544.163.704.91
P950.017.697.324.594.225.66
P990.028.107.454.714.335.89

Why the numbers look this way

iOS near zero — Core Animation runs animations inside a separate render server process called backboardd. The process that runs your app code has no involvement at all once the animation is committed. The ~0.01ms measured is essentially measurement noise. Android lower than ReanimatedObjectAnimator and SpringAnimation are lightweight OS-level animators. They update view properties directly on the UI thread with minimal overhead. Reanimated worklets involve a separate JS runtime that still communicates with the UI thread per frame.

Non-goals of react-native-ease

These animation patterns are outside the scope of this library by design:
  • Complex gesture-driven animations — pan, pinch, or velocity-based interactions require Reanimated and react-native-gesture-handler
  • Layout animations — animating width, height, or any property that triggers a layout pass is not supported
  • Shared element transitions — use Reanimated’s shared element API or React Navigation’s built-in transitions
  • Old architecture — Fabric (new architecture) only; the old bridge architecture is not supported

Can you use both in the same project?

Yes. react-native-ease and react-native-reanimated are completely independent and coexist without conflict. A common pattern is to use Ease for simple state-driven animations (tooltips, modals, cards) and Reanimated for gesture-driven interactions in the same app.
Both libraries can be installed and used simultaneously in the same project. There are no peer dependency conflicts.

Build docs developers (and LLMs) love