mcpField
R
react-native-animations

react-native-animations

github.com/pluginagentmarketplaceデザイン・UI10663 回インストール42 週間前に更新
リポジトリ

react-native-animations について

react-native-animations は、React Native 開発者向けに Reanimated 3、Gesture Handler、レイアウトアニメーションを解説する学習スキルです。パフォーマンス調整や実装時のよくある問題も扱います。

主な機能

  1. 01Reanimated 3 によるアニメーション作成
  2. 02Gesture Handler によるジェスチャー処理
  3. 03レイアウトの表示・退出アニメーション
  4. 04ジェスチャーとアニメーションの組み合わせ
  5. 05アニメーションやジェスチャーの問題解決

活用シーン

  1. 01スプリングや時間指定アニメーションの作成
  2. 02ドラッグ可能なインタラクティブ要素の開発
  3. 03リスト項目へのレイアウトアニメーション追加
  4. 04反応しないジェスチャーの原因調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-react-native --skill react-native-animations

インストール後、Claude Code で/react-native-animationsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
config.yaml
schema.json
references/
GUIDE.md
PATTERNS.md
scripts/
validate.py

詳細

React Native アニメーションスキル

Reanimated 3、Gesture Handler、レイアウトアニメーションを使った高パフォーマンスなアニメーションを学びます。

前提条件

  • React Native の基礎知識
  • JavaScript のクロージャの理解
  • トランスフォームとスタイルに関する知識

学習目標

このスキルを完了すると、次のことができるようになります。

  • Reanimated で滑らかな 60fps のアニメーションを作成する
  • Gesture Handler で複雑なジェスチャーを処理する
  • レイアウトの入場・退場アニメーションを実装する
  • パフォーマンスを考慮してアニメーションを最適化する
  • ジェスチャーとアニメーションを組み合わせる

対象トピック

1. インストール
npm install react-native-reanimated react-native-gesture-handler

# babel.config.js
module.exports = {
  plugins: ['react-native-reanimated/plugin'],
};
2. Reanimated の基礎
import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withSpring,
} from 'react-native-reanimated';

function AnimatedBox() {
  const scale = useSharedValue(1);

  const animatedStyle = useAnimatedStyle(() => ({
    transform: [{ scale: scale.value }],
  }));

  const handlePress = () => {
    scale.value = withSpring(scale.value === 1 ? 1.5 : 1);
  };

  return (
    <Pressable onPress={handlePress}>
      <Animated.View style={[styles.box, animatedStyle]} />
    </Pressable>
  );
}
3. Gesture Handler
import { Gesture, GestureDetector } from 'react-native-gesture-handler';

function DraggableBox() {
  const translateX = useSharedValue(0);
  const translateY = useSharedValue(0);

  const pan = Gesture.Pan()
    .onUpdate((e) => {
      translateX.value = e.translationX;
      translateY.value = e.translationY;
    })
    .onEnd(() => {
      translateX.value = withSpring(0);
      translateY.value = withSpring(0);
    });

  const style = useAnimatedStyle(() => ({
    transform: [
      { translateX: translateX.value },
      { translateY: translateY.value },
    ],
  }));

  return (
    <GestureDetector gesture={pan}>
      <Animated.View style={[styles.box, style]} />
    </GestureDetector>
  );
}
4. レイアウトアニメーション
import Animated, { FadeIn, FadeOut, Layout } from 'react-native-reanimated';

function AnimatedList({ items }) {
  return (
    <Animated.View layout={Layout.springify()}>
      {items.map((item) => (
        <Animated.View
          key={item.id}
          entering={FadeIn}
          exiting={FadeOut}
          layout={Layout.springify()}
        >
          <Text>{item.title}</Text>
        </Animated.View>
      ))}
    </Animated.View>
  );
}
5. アニメーションのタイミング
関数用途
withTiming線形で、時間を制御できるアニメーション
withSpring自然な、物理ベースのアニメーション
withDecay運動量ベースのアニメーション(フリング)
withSequence複数のアニメーションを順番に実行
withRepeatアニメーションをループ

クイックスタートの例

import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withSpring,
  interpolate,
} from 'react-native-reanimated';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';

function SwipeCard() {
  const translateX = useSharedValue(0);

  const gesture = Gesture.Pan()
    .onUpdate((e) => { translateX.value = e.translationX; })
    .onEnd(() => { translateX.value = withSpring(0); });

  const style = useAnimatedStyle(() => ({
    transform: [
      { translateX: translateX.value },
      { rotate: `${interpolate(translateX.value, [-200, 200], [-15, 15])}deg` },
    ],
  }));

  return (
    <GestureDetector gesture={gesture}>
      <Animated.View style={[styles.card, style]} />
    </GestureDetector>
  );
}

よくあるエラーと解決策

エラー原因解決策
"Attempted to call from worklet"runOnJS がありませんrunOnJS() でラップします
アニメーションが実行されない'worklet' がありません'worklet' ディレクティブを追加します
ジェスチャーが機能しないルートビューがありませんGestureHandlerRootView を追加します

検証チェックリスト

  • アニメーションが 60fps で動作する
  • ジェスチャーがスムーズに反応する
  • 低価格帯のデバイスでもフレーム落ちがない
  • レイアウトアニメーションでカクつきが発生しない

使い方

Skill("react-native-animations")

連携エージェント: 05-react-native-animation

コメント