{"id":3458,"date":"2025-04-16T16:06:55","date_gmt":"2025-04-16T14:06:55","guid":{"rendered":"https:\/\/uniquedevs.com\/blog\/react-native-reanimated\/"},"modified":"2025-04-17T14:22:41","modified_gmt":"2025-04-17T12:22:41","slug":"introduction-to-react-native-reanimated","status":"publish","type":"post","link":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/","title":{"rendered":"React Native Reanimated &#8211; an introduction to smooth and efficient animations in mobile apps"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Was ist React Native Reanimated?<\/h2>\n\n\n\n<p>React Native Reanimated is an advanced library for creating powerful native animations in applications built on React Native. It was developed and is being developed by Software Mansion &#8211; a Polish company specializing in creating tools for the React Native environment, which is also behind such projects as <code>react-native-gesture-handler<\/code> and <code>react-native-screens<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When and why should you use React Native Reanimated?<\/h2>\n\n\n\n<p>React Native Reanimated works best when you want smooth, responsive animations that don&#8217;t fail even in more complex user interfaces. Unlike the standard <code>Animated<\/code> API , Reanimated runs on a native UI thread, which means that animations are not dependent on JavaScript performance.<\/p>\n\n\n\n<p>With this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>animations do not clip, even when the application is performing intensive background operations,<\/li>\n\n\n\n<li>We can seamlessly combine them with gestures (e.g., drag, shift, pull),<\/li>\n\n\n\n<li>provide a user experience similar to native applications,<\/li>\n\n\n\n<li>work well in components such as bottom sheets, carousels, swipeable lists, drag &amp; drop and many others.<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s worth reaching for Reanimated when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>classic <code>Animated<\/code> begins to choke or is difficult to expand,<\/li>\n\n\n\n<li>you care about a modern, smooth UI (e.g., screen animations, transitions, modals),<\/li>\n\n\n\n<li>you create interfaces that are strongly dependent on gestures and touch.<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s a tool designed for applications to &#8220;feel&#8221; native &#8211; regardless of the platform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Basic concepts and terms<\/h2>\n\n\n\n<p>In order to effectively use React Native Reanimated, it is useful to understand some key concepts that differentiate this library from the standard approach in <a href=\"https:\/\/uniquedevs.com\/en\/blog\/what-is-react-native\/\">React Native<\/a>:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong><code>useSharedValue<\/code><\/strong><\/h3>\n\n\n\n<p>This is a special value type that lives outside the JavaScript thread and is shared with the native UI. We use it to store variables that will be animated (e.g. position, scale, transparency).<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const opacity = useSharedValue(0);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong><code>useAnimatedStyle<\/code><\/strong><\/h3>\n\n\n\n<p>A hook that allows you to assign animated values to a component style. It connects to <code>shared value<\/code>, to dynamically update the style without reloading the component.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const animatedStyle = useAnimatedStyle(() =&gt; ({\n  opacity: opacity.value,\n}));\n<\/code><\/pre>\n\n\n                        <div class=\"contact-banner boxes\" >\n                <div class=\"contact-banner__image\">\n                    <img decoding=\"async\" src=\"https:\/\/uniquedevs.com\/wp-content\/themes\/uniquedevs\/assets\/images\/boxes.webp\" alt=\"Need support with mobile projects?\">\n                <\/div>\n                <div class=\"contact-banner__image-mobile\">\n                    <img decoding=\"async\" src=\"https:\/\/uniquedevs.com\/wp-content\/themes\/uniquedevs\/assets\/images\/boxes-mobile.webp\" alt=\"Need support with mobile projects?\">\n                <\/div>\n                <div class=\"contact-banner__wprapper\">\n                                            <div class=\"contact-banner__wrapper-title\">\n                            Need support with mobile projects?                        <\/div>\n                                                                                            <a href=\"https:\/\/uniquedevs.com\/en\/contact\/\" class=\"contact-banner__wrapper-btn\" >\n                                Contact us!                            <\/a>\n                                                            <\/div>\n            <\/div>\n            \n\n\n<h3 class=\"wp-block-heading\">3. <strong>Worklets<\/strong><\/h3>\n\n\n\n<p>Worklets are functions labeled <code>\"worklet\"<\/code>, which are run outside the main JS thread &#8211; directly on a native engine (such as Hermes). This is the key to smooth animations that don&#8217;t depend on JavaScript performance.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>runOnUI(() =&gt; {\n  'worklet';\n  sharedValue.value = withSpring(1);\n})();\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>Animators: <code>withTiming<\/code>, <code>withSpring<\/code>, <code>withDelay<\/code><\/strong><\/h3>\n\n\n\n<p>Reanimated offers ready-made methods for animating values:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>withTiming<\/code> &#8211; linear animation in time (e.g., for transparency),<\/li>\n\n\n\n<li><code>withSpring<\/code> &#8211; spring animation with physics (ideal for displacement),<\/li>\n\n\n\n<li><code>withDelay<\/code>, <code>withSequence<\/code>, <code>withRepeat<\/code> &#8211; animation combinations for complex effects.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong><code>runOnUI<\/code> i <code>runOnJS<\/code><\/strong><\/h3>\n\n\n\n<p>These functions allow communication between the native animation thread and JavaScript logic:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>runOnUI()<\/code> &#8211; <code>runs<\/code> a function on the UI side (e.g., at the start of an animation),<\/li>\n\n\n\n<li><code>runOnJS()<\/code> &#8211; allows from the native context to call JS (e.g. callback after the animation is finished).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6. <strong><code>useDerivedValue<\/code><\/strong><\/h3>\n\n\n\n<p>Creates a value that depends on other shared values, automatically updating when they change.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const derived = useDerivedValue(() =&gt; {\n  return sharedValue.value * 2;\n});\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7. <strong><code>useAnimatedReaction<\/code><\/strong><\/h3>\n\n\n\n<p>It reacts to changes in shared values, allowing side effects to be performed in response to these changes.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>useAnimatedReaction(\n  () => sharedValue.value,\n  (newValue, oldValue) => {\n    \/\/ response to a change in values\n  }\n);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8. <strong><code>useAnimatedGestureHandler<\/code><\/strong><\/h3>\n\n\n\n<p>It integrates gestures with animations, enabling smooth user interactions with the interface.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const gestureHandler = useAnimatedGestureHandler({\n  onStart: (event, context) => {\n    \/\/ gesture started\n  },\n  onActive: (event, context) => {\n    \/\/ active gesture\n  },\n  onEnd: (event, context) => {\n    \/\/ gesture ended \n  },\n});\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">9. <strong><code>interpolate<\/code> i <code>interpolateColor<\/code><\/strong><\/h3>\n\n\n\n<p>Functions for converting values from one range to another, often used to create smooth transitions.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const animatedStyle = useAnimatedStyle(() =&gt; {\n  return {\n    opacity: interpolate(sharedValue.value, &#91;0, 1], &#91;0.5, 1]),\n  };\n});\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">How to install and configure React Native Reanimated?<\/h2>\n\n\n\n<p>It is very simple and will not cause you much trouble. You need to properly install the library and configure the project. Below you will find the steps needed to run Reanimated in a typical React Native application.<\/p>\n\n\n\n<p>1. To install React Native Reanimated run in terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>npm install react-native-reanimated\n<\/code><\/pre>\n\n\n\n<p>If you use Expo, remember that Reanimated is already part of the SDK, but you need to make sure you have the right version.<\/p>\n\n\n\n<p>2. Next, in the <code>babel.config.js<\/code> file, be sure to add the Reanimated plugin at the end of the plugin list:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>module.exports = {\n  presets: &#91;'module:metro-react-native-babel-preset'],\n  plugins: &#91;'react-native-reanimated\/plugin'], \/\/ &lt;-- must be the last!\n};\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">We create the first animation &#8211; smooth appearance and zoom of the component<\/h2>\n\n\n\n<p>Now that you know how to install the library, now we&#8217;ll create a component that appears smoothly on entry and zooms in slightly. Such animations are very often used in real applications &#8211; for example, to present product cards, welcome banners, notifications or onboarding screens.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>import React, { useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport Animated, {\n  useSharedValue,\n  useAnimatedStyle,\n  withTiming,\n} from 'react-native-reanimated';\n\nexport default function IntroCard() {\n  const opacity = useSharedValue(0);\n  const scale = useSharedValue(0.8);\n\n  useEffect(() =&gt; {\n    opacity.value = withTiming(1, { duration: 800 });\n    scale.value = withTiming(1, { duration: 800 });\n  }, &#91;]);\n\n  const animatedStyle = useAnimatedStyle(() =&gt; ({\n    opacity: opacity.value,\n    transform: &#91;{ scale: scale.value }],\n  }));\n\n  return (\n    &lt;Animated.View style={&#91;styles.card, animatedStyle]}&gt;\n      &lt;Text style={styles.text}&gt;Witaj w Reanimated \ud83c\udf89&lt;\/Text&gt;\n    &lt;\/Animated.View&gt;\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    backgroundColor: '#ffffff',\n    padding: 20,\n    margin: 20,\n    borderRadius: 12,\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 2 },\n    shadowOpacity: 0.2,\n    shadowRadius: 4,\n    elevation: 5,\n    alignItems: 'center',\n  },\n  text: {\n    fontSize: 18,\n    fontWeight: '600',\n  },\n});\n<\/code><\/pre>\n\n\n\n<p>What&#8217;s going on here?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparing values for animation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted language-markup\">const opacity = useSharedValue(0);<br>const scale = useSharedValue(0.8);<br><\/pre>\n\n\n\n<p><strong>What does this do?<\/strong><br>We create so-called &#8220;shared values&#8221;, which are special variables that will change during animation &#8211; but without affecting the main React thread. <code>opacity<\/code> controls transparency, and <code>scale<\/code> is responsible for size.<\/p>\n\n\n\n<p>We then run the animation when the component appears:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>useEffect(() =&gt; {\n  opacity.value = withTiming(1, { duration: 800 });\n  scale.value = withTiming(1, { duration: 800 });\n}, &#91;]);\n<\/code><\/pre>\n\n\n\n<p><strong>Why is this?<\/strong><br>We use&nbsp;<code>withTiming<\/code>, to smoothly change the values over time. The<code>opacity<\/code>&nbsp;increases from 0 to 1 (the component becomes visible) and&nbsp;<code>the scale<\/code>&nbsp;from 0.8 to 1 (a slight \u2018zoom\u2019 effect).<br><br>We create an animated style:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>const animatedStyle = useAnimatedStyle(() =&gt; ({\n  opacity: opacity.value,\n  transform: &#91;{ scale: scale.value }],\n}));\n<\/code><\/pre>\n\n\n\n<p>This style will dynamically update along with our <code>shared values<\/code>. It works like &#8220;magic&#8221; &#8211; no <code>setState<\/code>, no flashing, no slowing down the application.<\/p>\n\n\n\n<p>The use of an animated component:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>&lt;Animated.View style={&#91;styles.card, animatedStyle]}>\n  &lt;Text style={styles.text}>Welcom to Reanimated \ud83c\udf89&lt;\/Text>\n&lt;\/Animated.View>\n<\/code><\/pre>\n\n\n\n<p>We use <code>Animated.View<\/code>, because only it can understand animated styles. <code>Text<\/code> itself doesn&#8217;t animate &#8211; only the container it&#8217;s in.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reanimated vs Animated &#8211; why switch to a modern approach?<\/h2>\n\n\n\n<p>From the outset, React Native has offered the&nbsp;<code>Animated<\/code>&nbsp;library, which allows you to create animations in applications. However, with growing user expectations and the need for better performance, many teams began to look for a more flexible solution. This led to the creation of&nbsp;<strong>React Native Reanimated<\/strong>, a tool that breaks with the limitations of the old approach.<\/p>\n\n\n\n<p><strong>1. Performance<\/strong><br><code>Animated<\/code>runs on a JavaScript thread, which means that every animation goes through the JS-Native bridge. In practice, this leads to delays, especially if the application is heavily loaded.&nbsp;<strong>Reanimated<\/strong>, on the other hand, executes animations directly on the native UI thread, resulting in smoothness comparable to&nbsp;<a href=\"https:\/\/uniquedevs.com\/en\/blog\/what-is-a-mobile-app\/\">mobile applications<\/a>&nbsp;written in Swift or Kotlin.<\/p>\n\n\n\n<p><strong>2. API and coding style<\/strong><br><code>Animated<\/code>&nbsp;is based on an imperative approach \u2014 we need to create an animation variable (<code>new Animated.Value()<\/code>), initialize it, and then \u201cmanually\u201d start the animation using&nbsp;<code>.start()<\/code>. In Reanimated, we work in a declarative way: we use hooks such as&nbsp;<code>useSharedValue<\/code>&nbsp;or&nbsp;<code>useAnimatedStyle<\/code>, which makes the code more readable and logical, especially in large projects.<\/p>\n\n\n\n<p><strong>3. Component re-rendering<\/strong><br><code>Animated<\/code>&nbsp;often requires additional tricks to animate components without constantly reloading them. Reanimated does not need re-renders \u2014 all values live outside React and are updated in the background, which has a positive impact on performance and stability.<\/p>\n\n\n\n<p><strong>4. Gesture support<\/strong><br>With&nbsp;<code>Animated<\/code>, animating in response to gestures (e.g., swiping) can be difficult and counterintuitive. With Reanimated, thanks to tight integration with&nbsp;<code>react-native-gesture-handler<\/code>, gesture support is natural and very precise. You can create complex interactions with the fluidity of a native app.<\/p>\n\n\n\n<p><strong>5. Flexibility and capabilities<\/strong><br>Reanimated gives you access to advanced tools such as&nbsp;<code>withSpring<\/code>,&nbsp;<code>withSequence<\/code>,&nbsp;<code>withDelay<\/code>,&nbsp;<code>interpolate<\/code>,&nbsp;<code>useDerivedValue<\/code>, and&nbsp;<code>runOnJS<\/code>. No other animation API for React Native offers this kind of flexibility. In comparison,&nbsp;<code>Animated<\/code>&nbsp;feels quite rigid and requires more work for complex use cases.<\/p>\n\n\n\n<p><strong>6. Support and development<\/strong><br><code>Animated<\/code>is an older API that has been around for a long time in React Native, but is currently being developed very slowly. Reanimated is an active, modern project developed by Software Mansion, supported by a large community, and used in many top mobile apps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example \u2013 opacity animation in both approaches:<\/h3>\n\n\n\n<p>Animated:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>Animated.timing(animatedValue, {\n  toValue: 1,\n  duration: 500,\n  useNativeDriver: true,\n}).start();\n<\/code><\/pre>\n\n\n\n<p>You have to separately create a reference<code>(new Animated.Value(0)<\/code>), take care of <code>start()<\/code>, and worry about <code>useNativeDriver<\/code>.<\/p>\n\n\n\n<p>Reanimated:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>opacity.value = withTiming(1, { duration: 500 });\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">The most common mistakes and pitfalls<\/h2>\n\n\n\n<p>Reanimated is a powerful library, but like any tool &#8211; it has its nuances. Especially at the beginning, it&#8217;s easy to make some common mistakes that can lead to frustration and non-obvious errors in the operation of the application. Here&#8217;s a list of the most common problems and their causes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Missing plugin in <code>babel.config.js<\/code><\/h3>\n\n\n\n<p>The most common classic &#8211; forgetting to add <code>\"react-native-reanimated\/plugin\"<\/code> in the <code>babel.config.js<\/code> file . The plugin <strong>must be last<\/strong> in the list of plugins &#8211; otherwise the code from the <code>worklet<\/code> will not be processed correctly.<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>plugins: &#91;'react-native-reanimated\/plugin'] \/\/ &lt;-- the last!\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Incorrect components (e.g. <code>View<\/code> instead of <code>Animated.View<\/code>)<\/h3>\n\n\n\n<p>If you try to <code>useAnimatedStyle<\/code> on a regular <code>View<\/code>, nothing will happen &#8211; the animated style must be assigned to a component from the <code>Animated<\/code> space .<\/p>\n\n\n\n<p>Correct:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>&lt;Animated.View style={animatedStyle} \/&gt;\n<\/code><\/pre>\n\n\n\n<p>Incorrect:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>&lt;View style={animatedStyle} \/> \/\/ Won't work!\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Using <code>setState<\/code> inside <code>the worklet<\/code><\/h3>\n\n\n\n<p>Worklets run outside React, so you can&#8217;t use functions like <code>setState()<\/code> or <code>console.log()<\/code> inside them without using <code>runOnJS<\/code>. If you need to run something in the JS world from within <code>a worklet<\/code>, use:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>runOnJS(setState)(newValue);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. Attempting to animate a style that does not support native drivers<\/h3>\n\n\n\n<p>Not all styles can be animated in Reanimated (e.g.&nbsp;<code>zIndex<\/code>,&nbsp;<code>flexGrow<\/code>,&nbsp;<code>fontWeight<\/code>&nbsp;\u2014 in some versions). It is always a good idea to test the animation step by step and only use supported properties.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Forgetting about&nbsp;<code>value<\/code><\/h3>\n\n\n\n<p>In the case of&nbsp;<code>sharedValue<\/code>, you must refer to&nbsp;<code>.value<\/code>&nbsp;\u2014 this is the most commonly overlooked detail by people learning Reanimated.<br>Correct:<\/p>\n\n\n\n<pre class=\"wp-block-code language-markup\"><code>opacity.value = withTiming(1); \/\/ \u2705\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Why is React Native Reanimated more than just \u201cpretty\u201d animations?<\/h2>\n\n\n\n<p>At first glance, React Native Reanimated may seem like just a library for beautifying interfaces. However, its role in a mobile application goes far beyond aesthetics. In modern mobile app development, animations are not just a visual addition \u2014 they serve informational, organizational, and emotional functions. Reanimated allows you to implement them in a way that is both technically efficient and design-conscious.<\/p>\n\n\n\n<p>Well-designed animations make it easier to understand the context of an app: they show the relationships between elements, inform about changes in status, guide the user through the next steps, and give rhythm to interactions. Instead of surprising transitions or sudden changes in layout, the user gets a smooth, consistent flow that enhances the sense of control and intuitiveness. Reanimated allows for very precise reproduction of such microinteractions \u2014 without lag, with full control over gestures and animations.<\/p>\n\n\n\n<p>From a technical perspective, Reanimated is also an architectural tool. Moving the animation logic to a native thread significantly reduces the load on the main JavaScript thread, which is extremely important for complex screens, asynchronous data, gestures, and scrolling. In applications that need to run smoothly on mid-range devices, this separation of logic is a prerequisite.<\/p>\n\n\n\n<p>Reanimated also allows you to write your interface in a declarative, consistent, and easy-to-test way. Creating animations no longer requires separate component state management or workarounds. Component behavior logic can be written as clean, deterministic functions based on&nbsp;<code>sharedValue<\/code>,&nbsp;<code>useDerivedValue<\/code>, or&nbsp;<code>interpolate<\/code>. This makes the code simpler, more readable, and easier to maintain.<\/p>\n\n\n\n<p>That&#8217;s why Reanimated should not be treated as just a library of \u201cpretty effects.\u201d It is a full-fledged engineering and UX tool that allows you to design interfaces more consciously \u2014 with an emphasis on usability, performance, and predictability. In the modern world of mobile apps, this is not just an advantage. It&#8217;s the standard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended learning resources<\/h2>\n\n\n\n<p>If you want to better understand the potential of Reanimated and deepen your knowledge, it&#8217;s worth checking out a few proven sources that will help you step by step, such as:&nbsp;<a href=\"https:\/\/docs.swmansion.com\/react-native-reanimated\/docs\/fundamentals\/getting-started\/\">https:\/\/docs.swmansion.com\/react-native-reanimated\/docs\/fundamentals\/getting-started\/<\/a>,&nbsp;<a href=\"https:\/\/github.com\/software-mansion\/react-native-reanimated\">https:\/\/github.com\/software-mansion\/react-native-reanimated<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ \u2013 frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Can I use Reanimated with Expo?<\/h3>\n\n\n\n<p>Yes, Reanimated works with Expo, but full support (especially for gestures and some native features) is available from SDK 46 onwards. Make sure you have the latest version of Expo and the Babel plugin configured correctly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Does Reanimated work with React Navigation?<\/h3>\n\n\n\n<p>Yes, and very well. Reanimated is even recommended for animated screen transitions in React Navigation. It works seamlessly with&nbsp;<code>react-native-screens<\/code>&nbsp;and&nbsp;<code>gesture-handler<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. What animations can I create with Reanimated?<\/h3>\n\n\n\n<p>Practically any\u2014from simple fade-ins and transformations to advanced bottom sheets, interactive carousels, drag &amp; drop, swipeable lists, and smooth reactions to gestures and scrolling. Reanimated gives you complete freedom.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Does Reanimated work on both Android and iOS?<\/h3>\n\n\n\n<p>Yes. Reanimated works natively and fully supports both platforms \u2014 iOS and Android. Importantly, it runs smoothly even on older devices and mid-range phones.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Want to create smooth, responsive animations in React Native that really look and work like native animations? Learn about React Native Reanimated &#8211; a powerful animation library that works outside of JavaScript threads. In this step-by-step article, we explain how it works, when it&#8217;s a good idea to use it, and how to start creating modern, powerful mobile interfaces using Reanimated.<\/p>\n","protected":false},"author":2,"featured_media":4854,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[16],"tags":[],"class_list":["post-3458","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>React Native Reanimated - an introduction to modern animation<\/title>\n<meta name=\"description\" content=\"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Native Reanimated - an introduction to modern animation\" \/>\n<meta property=\"og:description\" content=\"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\" \/>\n<meta property=\"og:site_name\" content=\"Software House - rozwi\u0105zania IT dla Twojego biznesu | UniqueDevs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/Unique-Devs\/61564365418277\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-16T14:06:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-17T12:22:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"853\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Hubert Olech\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hubert Olech\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\"},\"author\":{\"name\":\"Hubert Olech\",\"@id\":\"https:\/\/uniquedevs.com\/#\/schema\/person\/a2c9b776ac544a910615b03c8b9c4c18\"},\"headline\":\"React Native Reanimated &#8211; an introduction to smooth and efficient animations in mobile apps\",\"datePublished\":\"2025-04-16T14:06:55+00:00\",\"dateModified\":\"2025-04-17T12:22:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\"},\"wordCount\":1891,\"publisher\":{\"@id\":\"https:\/\/uniquedevs.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp\",\"articleSection\":[\"Mobile\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\",\"url\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\",\"name\":\"React Native Reanimated - an introduction to modern animation\",\"isPartOf\":{\"@id\":\"https:\/\/uniquedevs.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp\",\"datePublished\":\"2025-04-16T14:06:55+00:00\",\"dateModified\":\"2025-04-17T12:22:41+00:00\",\"description\":\"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.\",\"breadcrumb\":{\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage\",\"url\":\"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp\",\"contentUrl\":\"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp\",\"width\":1280,\"height\":853},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/uniquedevs.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mobile\",\"item\":\"https:\/\/uniquedevs.com\/blog\/category\/mobile\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"React Native Reanimated &#8211; an introduction to smooth and efficient animations in mobile apps\"}]},{\"@type\":\"Website\",\"@id\":\"https:\/\/uniquedevs.com\/#website\",\"url\":\"https:\/\/uniquedevs.com\/\",\"name\":\"Software House - rozwi\u0105zania IT dla Twojego biznesu | UniqueDevs\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/uniquedevs.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/uniquedevs.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},[],{\"@type\":\"Person\",\"@id\":\"https:\/\/uniquedevs.com\/#\/schema\/person\/a2c9b776ac544a910615b03c8b9c4c18\",\"name\":\"Hubert Olech\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/uniquedevs.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/uniquedevs.com\/wp-content\/litespeed\/avatar\/4aa41b6b162ba5c7c2dc5577af43de87.jpg?ver=1776685844\",\"contentUrl\":\"https:\/\/uniquedevs.com\/wp-content\/litespeed\/avatar\/4aa41b6b162ba5c7c2dc5577af43de87.jpg?ver=1776685844\",\"caption\":\"Hubert Olech\"},\"description\":\"Huber Olech - Founder @UniqueDevs. \u0141\u0105cz\u0119 \u015bwiat technologii z biznesem, pomagaj\u0105c firmom rozwija\u0107 si\u0119 dzi\u0119ki innowacyjnym rozwi\u0105zaniom cyfrowym. Pasja do software development zainspirowa\u0142a mnie do zbudowania zespo\u0142u ekspert\u00f3w, z kt\u00f3rymi wsp\u00f3lnie dostarczamy najwy\u017cszej jako\u015bci produkty dla swoich Klient\u00f3w. W oparciu o swoje wieloletnie do\u015bwiadczenie w bran\u017cy IT, rozumiem trendy w nowych technologiach i potrafi\u0119 przeku\u0107 je w wymierne korzy\u015bci dla firm. Moj\u0105 misj\u0105 jest tworzenie rozwi\u0105za\u0144, kt\u00f3re nie tylko usprawniaj\u0105 procesy, ale tak\u017ce otwieraj\u0105 przed Klientami nowe mo\u017cliwo\u015bci rynkowe i zwi\u0119kszaj\u0105 ich konkurencyjno\u015b\u0107.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/hubert-olech-b0a524167\/\"],\"url\":\"https:\/\/uniquedevs.com\/en\/blog\/author\/h-olech\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"React Native Reanimated - an introduction to modern animation","description":"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"React Native Reanimated - an introduction to modern animation","og_description":"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.","og_url":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/","og_site_name":"Software House - rozwi\u0105zania IT dla Twojego biznesu | UniqueDevs","article_publisher":"https:\/\/www.facebook.com\/people\/Unique-Devs\/61564365418277\/","article_published_time":"2025-04-16T14:06:55+00:00","article_modified_time":"2025-04-17T12:22:41+00:00","og_image":[{"width":1280,"height":853,"url":"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp","type":"image\/webp"}],"author":"Hubert Olech","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Hubert Olech","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#article","isPartOf":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/"},"author":{"name":"Hubert Olech","@id":"https:\/\/uniquedevs.com\/#\/schema\/person\/a2c9b776ac544a910615b03c8b9c4c18"},"headline":"React Native Reanimated &#8211; an introduction to smooth and efficient animations in mobile apps","datePublished":"2025-04-16T14:06:55+00:00","dateModified":"2025-04-17T12:22:41+00:00","mainEntityOfPage":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/"},"wordCount":1891,"publisher":{"@id":"https:\/\/uniquedevs.com\/#organization"},"image":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage"},"thumbnailUrl":"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp","articleSection":["Mobile"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/","url":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/","name":"React Native Reanimated - an introduction to modern animation","isPartOf":{"@id":"https:\/\/uniquedevs.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage"},"image":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage"},"thumbnailUrl":"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp","datePublished":"2025-04-16T14:06:55+00:00","dateModified":"2025-04-17T12:22:41+00:00","description":"Learn what React Native Reanimated is, how it works and why you should use it. Practical examples, comparisons and step-by-step animations.","breadcrumb":{"@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#primaryimage","url":"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp","contentUrl":"https:\/\/uniquedevs.com\/wp-content\/uploads\/2025\/04\/online-4208112_1280.webp","width":1280,"height":853},{"@type":"BreadcrumbList","@id":"https:\/\/uniquedevs.com\/en\/blog\/introduction-to-react-native-reanimated\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/uniquedevs.com\/en\/"},{"@type":"ListItem","position":2,"name":"Mobile","item":"https:\/\/uniquedevs.com\/blog\/category\/mobile\/"},{"@type":"ListItem","position":3,"name":"React Native Reanimated &#8211; an introduction to smooth and efficient animations in mobile apps"}]},{"@type":"Website","@id":"https:\/\/uniquedevs.com\/#website","url":"https:\/\/uniquedevs.com\/","name":"Software House - rozwi\u0105zania IT dla Twojego biznesu | UniqueDevs","description":"","publisher":{"@id":"https:\/\/uniquedevs.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uniquedevs.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},[],{"@type":"Person","@id":"https:\/\/uniquedevs.com\/#\/schema\/person\/a2c9b776ac544a910615b03c8b9c4c18","name":"Hubert Olech","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uniquedevs.com\/#\/schema\/person\/image\/","url":"https:\/\/uniquedevs.com\/wp-content\/litespeed\/avatar\/4aa41b6b162ba5c7c2dc5577af43de87.jpg?ver=1776685844","contentUrl":"https:\/\/uniquedevs.com\/wp-content\/litespeed\/avatar\/4aa41b6b162ba5c7c2dc5577af43de87.jpg?ver=1776685844","caption":"Hubert Olech"},"description":"Huber Olech - Founder @UniqueDevs. \u0141\u0105cz\u0119 \u015bwiat technologii z biznesem, pomagaj\u0105c firmom rozwija\u0107 si\u0119 dzi\u0119ki innowacyjnym rozwi\u0105zaniom cyfrowym. Pasja do software development zainspirowa\u0142a mnie do zbudowania zespo\u0142u ekspert\u00f3w, z kt\u00f3rymi wsp\u00f3lnie dostarczamy najwy\u017cszej jako\u015bci produkty dla swoich Klient\u00f3w. W oparciu o swoje wieloletnie do\u015bwiadczenie w bran\u017cy IT, rozumiem trendy w nowych technologiach i potrafi\u0119 przeku\u0107 je w wymierne korzy\u015bci dla firm. Moj\u0105 misj\u0105 jest tworzenie rozwi\u0105za\u0144, kt\u00f3re nie tylko usprawniaj\u0105 procesy, ale tak\u017ce otwieraj\u0105 przed Klientami nowe mo\u017cliwo\u015bci rynkowe i zwi\u0119kszaj\u0105 ich konkurencyjno\u015b\u0107.","sameAs":["https:\/\/www.linkedin.com\/in\/hubert-olech-b0a524167\/"],"url":"https:\/\/uniquedevs.com\/en\/blog\/author\/h-olech\/"}]}},"_links":{"self":[{"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/posts\/3458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/comments?post=3458"}],"version-history":[{"count":3,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/posts\/3458\/revisions"}],"predecessor-version":[{"id":3464,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/posts\/3458\/revisions\/3464"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/media\/4854"}],"wp:attachment":[{"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/media?parent=3458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/categories?post=3458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uniquedevs.com\/en\/wp-json\/wp\/v2\/tags?post=3458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}