Creating Reanimated Animations

estevg/skills/plugins/creating-reanimated-animations/skills/creating-reanimated-animations

作者 estevg2cb99d6df0d501f61bace7fff48625878d2cbbdc無授權條款收錄於 2026年10月9日更新於 2026年10月9日

Generate React Native Reanimated animation code for React Native apps. Use when user asks to create, implement, or add animations in React Native — including transitions, gestures, scroll-linked effects, layout animations, layout transitions, entering/exiting animations, CSS animations, CSS transitions, shared element transitions, color animations, parallax, fade, slide, scale, spring, timing, decay, keyframes, worklets, accordion, bottom sheet, flip card, collapsing header, or any motion effect using react-native-reanimated. Also use for integrating react-native-gesture-handler with Reanimated, understanding worklets, animating between screens, testing animations with Jest, or checking which properties are animatable.

AI 產生的概覽

為 React Native Reanimated 產生動畫程式碼,涵蓋轉場、手勢、版面動畫與 worklet。

功能
此技能會產生 React Native Reanimated 動畫程式碼,同時支援 v3 與 v4,包含 timing、spring、decay、repeat 與 sequence 動畫、插值、捲動連動效果、版面動畫與進入/離開動畫、CSS 風格動畫與轉場、共享元素轉場以及手勢整合。它也會引導閱讀隨附的參考檔案,以取得 API 簽章、worklet、元件模式與測試相關內容。產出為程式碼與指引,而非可直接執行的成品。
適用情境
當使用者要求在 React Native 應用程式中使用 react-native-reanimated 建立、實作或加入動效時使用,例如淡入淡出、滑動、彈簧、視差、手風琴、底部彈出面板或畫面切換。也適用於關於 worklet、gesture-handler 整合、可動畫屬性或以 Jest 測試動畫的問題。
執行需求
僅為說明文件,不附帶指令碼。目標專案需要 react-native-reanimated,v4 另需 react-native-worklets,並須將 Babel 外掛設定於最後;手勢相關功能需要 react-native-gesture-handler 與 GestureHandlerRootView。使用時會閱讀隨附的參考檔案。

React Native Reanimated Code Generator

Generate performant animation code using React Native Reanimated. Supports both v3 and v4.

Version Detection

Check the project's package.json to determine the version:

  • v4 (New Architecture only): requires react-native-worklets as separate dependency
  • v3 (supports Legacy and New Architecture): single package install

Setup

Reanimated v4 (latest)

bash
npm install react-native-reanimated react-native-worklets

Babel plugin: 'react-native-worklets/plugin' (must be last in plugins list). For Expo: no Babel config needed. Run npx expo prebuild after install.

Reanimated v3

bash
npm install react-native-reanimated

Babel plugin: 'react-native-reanimated/plugin' (must be last in plugins list).

Core Pattern

Every animation follows three steps:

tsx
import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated';
function Component() {  // 1. Create shared value (lives on UI thread)  const offset = useSharedValue(0);
  // 2. Bind to style  const animatedStyle = useAnimatedStyle(() => ({    transform: [{ translateX: offset.value }],  }));
  // 3. Trigger animation  const handlePress = () => {    offset.value = withTiming(200, { duration: 500 });  };
  return (    <Animated.View style={[styles.box, animatedStyle]}>      <Pressable onPress={handlePress}><Text>Move</Text></Pressable>    </Animated.View>  );}

Animation Selection

User wantsFunctionKey params
Smooth fixed-duration transitionwithTiming(to, {duration, easing})Default: 300ms, Easing.inOut(Easing.quad)
Natural bouncy feelwithSpring(to, {mass, damping, stiffness})Default: mass=1, damping=10, stiffness=100
Momentum after flingwithDecay({velocity, clamp})Needs initial velocity from gesture
Clamp spring rangewithClamp({min, max}, withSpring(to))v4: limits spring overshoot
Loop/pulse/shakewithRepeat(anim, reps, reverse)reps=0 for infinite (v4), reps=-1 (v3)
Multi-step choreographywithSequence(anim1, anim2, ...)Runs in order
Delayed startwithDelay(ms, anim)Delays any animation

Spring tuning: lower damping (5–8) = more bounce, higher stiffness (150–200) = snappier, higher mass (2–3) = heavier.

Quick Patterns

Fade

tsx
const opacity = useSharedValue(0);const style = useAnimatedStyle(() => ({ opacity: opacity.value }));// Show: opacity.value = withTiming(1);// Hide: opacity.value = withTiming(0);

Slide from side

tsx
const translateX = useSharedValue(-SCREEN_WIDTH);const style = useAnimatedStyle(() => ({  transform: [{ translateX: translateX.value }],}));// Enter: translateX.value = withSpring(0);

Scale on press

tsx
const scale = useSharedValue(1);const style = useAnimatedStyle(() => ({  transform: [{ scale: scale.value }],}));// In:  scale.value = withSpring(0.95);// Out: scale.value = withSpring(1);

Interpolation

tsx
import { interpolate, Extrapolation } from 'react-native-reanimated';
const style = useAnimatedStyle(() => ({  opacity: interpolate(scrollY.value, [0, 100], [1, 0], Extrapolation.CLAMP),  transform: [{    scale: interpolate(scrollY.value, [0, 100], [1, 0.8], Extrapolation.CLAMP),  }],}));

Scroll-linked animation

tsx
const scrollY = useSharedValue(0);const scrollHandler = useAnimatedScrollHandler({  onScroll: (event) => { scrollY.value = event.contentOffset.y; },});<Animated.ScrollView onScroll={scrollHandler}>{children}</Animated.ScrollView>

Or simpler with useScrollOffset (v4) / useScrollViewOffset (v3):

tsx
const ref = useAnimatedRef<Animated.ScrollView>();const scrollOffset = useScrollOffset(ref); // auto-tracks scroll position<Animated.ScrollView ref={ref}>{children}</Animated.ScrollView>

Layout Animations (Mount/Unmount)

Built-in presets — no shared values needed:

tsx
import Animated, { FadeIn, SlideInRight, SlideOutLeft } from 'react-native-reanimated';
<Animated.View entering={FadeIn.duration(400).delay(100)} exiting={SlideOutLeft.duration(300)}>  {content}</Animated.View>

Presets: FadeIn/Out, SlideIn/OutLeft/Right/Up/Down, ZoomIn/Out, BounceIn/Out, FlipInEasyX/Y, LightSpeedIn/Out, PinwheelIn/Out, RollIn/Out, RotateIn/Out, StretchIn/Out.

Modifiers: .duration(ms), .delay(ms), .springify(), .damping(n), .stiffness(n), .randomDelay(), .reduceMotion(), .withCallback().

Layout Transitions (position/size changes)

Animate when component position or size changes:

tsx
import { LinearTransition, SequencedTransition } from 'react-native-reanimated';
<Animated.View layout={LinearTransition.springify().damping(15)} />

Transitions: LinearTransition, SequencedTransition, FadingTransition, JumpingTransition, CurvedTransition, EntryExitTransition.

Keyframe Animations (complex entering/exiting)

tsx
import { Keyframe } from 'react-native-reanimated';
const enteringAnimation = new Keyframe({  0: { opacity: 0, transform: [{ translateY: -50 }] },  50: { opacity: 0.5, transform: [{ translateY: -25 }], easing: Easing.out(Easing.quad) },  100: { opacity: 1, transform: [{ translateY: 0 }] },}).duration(500);
<Animated.View entering={enteringAnimation}>{content}</Animated.View>

For custom animations, layout transitions, and list animations, read references/layout-animations.md.

CSS Animations (v4 only)

Declarative CSS-like animations using style props directly:

tsx
<Animated.View style={{  animationName: {    from: { opacity: 0, transform: [{ translateY: -20 }] },    to: { opacity: 1, transform: [{ translateY: 0 }] },  },  animationDuration: '500ms',  animationTimingFunction: 'ease-out',}} />

Supported props: animationName, animationDuration, animationDelay, animationIterationCount, animationDirection, animationFillMode, animationPlayState, animationTimingFunction.

CSS Transitions (v4 only)

Automatic transitions when style values change:

tsx
<Animated.View style={{  width: isExpanded ? 200 : 100,  transitionProperty: 'width',  transitionDuration: '300ms',  transitionTimingFunction: 'ease-in-out',}} />

Multiple properties: transitionProperty: ['width', 'opacity', 'transform'] with matching transitionDuration: ['300ms', '200ms', '500ms'].

For detailed CSS animations/transitions reference (keyframes, timing functions, examples), read references/css-animations-detailed.md.

Shared Element Transitions (Experimental)

Animate components between screens during navigation:

tsx
// Screen A<Animated.Image sharedTransitionTag={`photo-${id}`} source={...} />
// Screen B (same tag)<Animated.Image sharedTransitionTag={`photo-${id}`} source={...} />

Requires @react-navigation/native-stack and feature flag. For setup and customization, read references/shared-element-transitions.md.

Gesture Integration

For drag, pinch, fling, and other gesture-driven animations, read references/gesture-patterns.md.

Requires: react-native-gesture-handler + <GestureHandlerRootView> at app root.

Full API Reference

For complete hook signatures, animation parameters, v3↔v4 differences, and advanced APIs, read references/api-reference.md.

Worklets & Advanced APIs

For understanding worklets, 'worklet' directive, runOnJS/runOnUI, useAnimatedReaction, useFrameCallback, measure, dispatchCommand, and performance tips, read references/worklets-advanced.md.

Real-World Component Patterns

For full implementations of accordion, bottom sheet, flip card, and FAB, read references/component-patterns.md.

Testing, Colors & Supported Properties

For testing animations with Jest, animating colors with interpolateColor, and the full list of animatable properties by platform, read references/testing-and-properties.md.

Rules

  • Always use Animated.View/Text/Image/ScrollView/FlatList — never animate plain RN components
  • v4: use runOnJS/runOnUI (re-exported), or import scheduleOnRN/scheduleOnUI from react-native-worklets
  • v3: use runOnJS(fn)() for heavy JS-thread logic
  • Always use Extrapolation.CLAMP with interpolate unless you explicitly want extrapolation
  • Combine: withSequence(withTiming(1.2, {duration: 100}), withSpring(1))
  • Use useReducedMotion() to respect accessibility settings
  • Test on real devices — simulator performance differs significantly
  • v4: useAnimatedKeyboard is deprecated → use react-native-keyboard-controller

Based on react-native-reanimated by Software Mansion (MIT License)

來源與署名

來源:estevg/skills位於plugins/creating-reanimated-animations/skills/creating-reanimated-animations提交2cb99d6

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架