RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-03-30上級

Rork × React Native Reanimated & Gesture Handler 実践ガイド — 60fps を維持するアニメーション設計と高度なジェスチャーインタラクション

Reanimated 3 と Gesture Handler で 60fps を保つ設計を、壁紙・癒し系アプリの実運用で踏んだ落とし穴とともに整理しました。runOnJS の発火遅延、useDerivedValue キャッシュ、FlashList との併用、cancelAnimation 漏れなど、公式ドキュメント外の知見を実測値付きで共有します。

Reanimated10Gesture Handler2アニメーション10パフォーマンス30UI/UX3React Native209Rork515

プレミアム記事

取り組みの背景 — なぜ Reanimated と Gesture Handler が必要なのか

モバイルアプリの品質を決定づける要素のひとつが、アニメーションの滑らかさとジェスチャーの反応速度です。ユーザーはスクロール、スワイプ、ピンチズームといった操作を無意識に行っており、わずかなカクつきや遅延でも「このアプリは使いにくい」と感じてしまいます。

React Native の標準 Animated API は基本的なアニメーションには十分ですが、複雑なジェスチャー連動アニメーションや 60fps を維持する高度なトランジションには限界があります。ここで登場するのが React Native Reanimated 3React Native Gesture Handler です。

Reanimated はアニメーションロジックを UI スレッド(ネイティブ側) で直接実行する仕組みを持ち、JavaScript スレッドのボトルネックを完全に回避します。Gesture Handler はネイティブレベルでジェスチャーを認識し、Reanimated と組み合わせることで「指に吸いつくような」操作感を実現します。

私は 2013 年から個人で iOS / Android アプリを運営していて、壁紙系・癒し系・引き寄せ系といった「静かに毎日触ってもらう」ユーティリティを中心に育ててきました。こうしたアプリでは派手な演出は要らない代わりに、スワイプやピンチの一瞬の引っかかりがそのまま離脱につながります。Reanimated と Gesture Handler を実際のプロダクトに入れてきて、公式ドキュメントどおりに書いても本番でだけ崩れる場面に何度もぶつかりました。この記事では、基本のアーキテクチャと4つの実装パターンに加えて、その「ドキュメント外の落とし穴」を実測値とともにまとめています。


Reanimated 3 のアーキテクチャ — Worklet と Shared Value の仕組み

なぜ従来の Animated API では不十分なのか

React Native の標準 Animated API は、アニメーションの値変更を JS スレッドで計算し、ブリッジ経由で UI スレッドに送信します。このアーキテクチャでは、JS スレッドが重い処理(API コール、データ変換など)で忙しいとき、アニメーションがカクつきます。

Reanimated 3 はこの問題を Worklet という概念で解決します。Worklet とは、UI スレッド上で直接実行される JavaScript 関数です。'worklet' ディレクティブを関数の先頭に記述するだけで、その関数は自動的に UI スレッドにシリアライズされて実行されます。

Shared Value — スレッド間の高速なデータ共有

useSharedValue で作成された値は、JS スレッドと UI スレッドの両方から安全にアクセスできます。従来のブリッジを経由しないため、値の更新がフレーム落ちなく反映されます。

import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withSpring,
  withTiming,
  Easing,
} from 'react-native-reanimated';
 
// コンポーネント内で使用
// Shared Value を作成(UIスレッドとJSスレッドの両方からアクセス可能)
const translateX = useSharedValue(0);
const scale = useSharedValue(1);
 
// アニメーションスタイルを宣言的に定義
// この関数はUIスレッドで実行されるため、JSスレッドのブロックを回避
const animatedStyle = useAnimatedStyle(() => ({
  transform: [
    { translateX: translateX.value },
    { scale: scale.value },
  ],
}));
 
// スプリングアニメーションで値を更新
// damping: 振動の減衰速度、stiffness: バネの硬さ
const handlePress = () => {
  translateX.value = withSpring(200, {
    damping: 15,      // 低い値 = より多くバウンド
    stiffness: 150,   // 高い値 = より速い動き
    mass: 1,          // 質量(慣性に影響)
  });
  scale.value = withTiming(1.2, {
    duration: 300,
    easing: Easing.bezier(0.25, 0.1, 0.25, 1),
  });
};
 
// JSX で使用
// <Animated.View style={[styles.box, animatedStyle]} />

Derived Value — 計算済みアニメーション値

useDerivedValue を使うと、他の Shared Value に基づいた計算値を UI スレッド上で自動的に更新できます。

import { useDerivedValue, interpolate } from 'react-native-reanimated';
 
// translateX に基づいて回転角度を自動計算
const rotation = useDerivedValue(() => {
  // translateX が -200〜200 のとき、回転を -30〜30 度にマッピング
  return interpolate(
    translateX.value,
    [-200, 0, 200],
    [-30, 0, 30],
    'clamp' // 範囲外の値をクランプ
  );
});
 
// 透明度も連動して変化
const opacity = useDerivedValue(() => {
  return interpolate(
    Math.abs(translateX.value),
    [0, 150, 200],
    [1, 0.8, 0.3]
  );
});

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
壁紙グリッドの初期描画を 820ms から 310ms、メモリを 180MB から 96MB に下げた FlashList と単一 Shared Value の併用パターン
runOnJS の発火遅延・useDerivedValue キャッシュ・cancelAnimation 漏れなど、Crashlytics と実機計測で気づいた本番運用の落とし穴6つ
累計5,000万DLの個人開発で固めた withSpring プリセット2種と、ScrollView とジェスチャーが競合したときの実機チェックリスト
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-05-06
Rorkアプリのアニメーションがカクつく — フレームドロップの根本原因を特定して直した手順
Rorkで生成されたアニメーションがカクつく問題の根本原因と修正手順を解説します。JSスレッドとUIスレッドの分離、useNativeDriverの使い方、フレームドロップの診断方法まで実践的にまとめました。
開発ツール2026-04-29
Rork アプリに Bottom Sheet を組み込む実践ガイド — @gorhom/bottom-sheet で iOS と Android の操作感を揃える
Rork が生成する Modal は便利ですが、複数のスナップポイントや慣性スクロールが必要になった瞬間に物足りなくなります。@gorhom/bottom-sheet を後から差し込む実装手順、キーボード対応、iOS/Android の差分対処までを実例で解説します。
開発ツール2026-04-25
Rork アプリでスケルトンスクリーンを実装する — 読み込み中の体感速度を改善する実践パターン
Rork で作ったアプリの「読み込み中」が、ただのぐるぐるスピナーで終わっていませんか。スケルトンスクリーンと Shimmer エフェクトを取り入れるだけで、体感速度と離脱率は大きく変わります。実装の型と注意点を整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →