React Native Reanimated helps you create smooth and fast animations in your app. It makes animations run better by using the native side of the phone.
React Native Reanimated
import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated'; const progress = useSharedValue(0); const animatedStyle = useAnimatedStyle(() => { return { opacity: progress.value, }; });
useSharedValue creates a value that can change over time and be used in animations.
useAnimatedStyle returns styles that update automatically when shared values change.
const progress = useSharedValue(0); const animatedStyle = useAnimatedStyle(() => ({ opacity: withTiming(progress.value, { duration: 300 }), }));
const scale = useSharedValue(1);
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
}));This app shows a blue square that fades in and out when you press the buttons. The opacity changes smoothly thanks to Reanimated.
import React from 'react'; import { View, Button } from 'react-native'; import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated'; export default function App() { const opacity = useSharedValue(0); const animatedStyle = useAnimatedStyle(() => ({ opacity: opacity.value, })); return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Animated.View style={[{ width: 100, height: 100, backgroundColor: 'blue' }, animatedStyle]} /> <Button title="Fade In" onPress={() => { opacity.value = withTiming(1, { duration: 500 }); }} /> <Button title="Fade Out" onPress={() => { opacity.value = withTiming(0, { duration: 500 }); }} /> </View> ); }
Always wrap animated styles in useAnimatedStyle to link them to shared values.
Use withTiming for smooth timing-based animations.
Reanimated runs animations on the native thread, so animations stay smooth even if the JavaScript thread is busy.
React Native Reanimated helps create smooth, native animations.
Use useSharedValue to hold animation values.
Use useAnimatedStyle to apply animated styles that update automatically.
Practice
What is the main purpose of useSharedValue in React Native Reanimated?
Solution
Step 1: Understand
useSharedValueroleuseSharedValueis designed to store values that can change and animate smoothly.Step 2: Compare with other options
Static styles, user inputs, and navigation are unrelated touseSharedValue.Final Answer:
To hold and update animation values that can change over time -> Option AQuick Check:
useSharedValue = hold animation values [OK]
- Confusing useSharedValue with static styling
- Thinking it handles user input or navigation
- Assuming it triggers animations directly
Which of the following is the correct syntax to create an animated style using useAnimatedStyle?
const animatedStyle = useAnimatedStyle(() => {
return {
opacity: sharedValue.value
};
});Solution
Step 1: Check arrow function syntax
Returning an object directly requires parentheses around the object:() => ({ ... }).Step 2: Validate each option
const animatedStyle = useAnimatedStyle(() => ({ opacity: sharedValue.value })); uses correct syntax with parentheses. Options A, C, and D have syntax errors.Final Answer:
const animatedStyle = useAnimatedStyle(() => ({ opacity: sharedValue.value })); -> Option BQuick Check:
Arrow function returning object needs parentheses [OK]
- Missing parentheses around returned object
- Using return without braces properly
- Using array brackets instead of object braces
Given the code below, what will be the opacity of the Animated.View after the shared value updates to 0.5?
const opacity = useSharedValue(1);
const animatedStyle = useAnimatedStyle(() => ({
opacity: opacity.value
}));
// Later in code
opacity.value = 0.5;Solution
Step 1: Understand shared value update
Updatingopacity.valuedirectly sets the value immediately without animation.Step 2: Direct assignment causes instant jump
Reanimated updates the style instantly to 0.5 when using direct assignment, without smooth interpolation.Final Answer:
The opacity will instantly jump to 0.5 without animation -> Option DQuick Check:
Direct sharedValue.value = instant update [OK]
- Thinking the value stays the same after update
- Assuming it animates smoothly without withTiming
- Confusing with non-animated style updates
Identify the error in the following code snippet using React Native Reanimated:
const progress = useSharedValue(0);
const animatedStyle = useAnimatedStyle(() => {
transform: [{ translateX: progress }]
});Solution
Step 1: Check how shared values are accessed
InsideuseAnimatedStyle, shared values must be accessed with.value.Step 2: Identify the error in transform
The code usesprogressinstead ofprogress.value, causing a runtime error.Final Answer:
Missing .value when accessing shared value inside useAnimatedStyle -> Option CQuick Check:
Access sharedValue.value inside animated styles [OK]
- Forgetting .value on shared values
- Calling useSharedValue inside effects incorrectly
- Misunderstanding transform property format
You want to create a button that scales up smoothly when pressed and returns to normal size when released. Which approach correctly uses React Native Reanimated to achieve this?
const scale = useSharedValue(1);
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }]
}));
// On press in
scale.value = withTiming(1.2, { duration: 200 });
// On press out
scale.value = withTiming(1, { duration: 200 });Solution
Step 1: Check useSharedValue and useAnimatedStyle usage
UsinguseSharedValueto hold scale anduseAnimatedStyleto apply transform is correct.Step 2: Verify animation with withTiming
withTimingsmoothly animates the scale value on press in and out events.Step 3: Confirm event handler usage
Assigningscale.value = withTiming(...)inside press handlers is valid and triggers animation.Final Answer:
This approach correctly animates scale on press in and out using withTiming -> Option AQuick Check:
UseSharedValue + withTiming = smooth press scale animation [OK]
- Using useState instead of useSharedValue for animation
- Thinking withTiming can't be used in event handlers
- Believing transform can't animate
Ready to prove it?
Pass the test and this pattern moves unknown
