Skip to content
React Native Reanimated ガイドブック
Esc
navigateopen⌘Jpreview
On this page

2つのアニメーションAPI

HooksベースのコアAPIとCSSアニメーションAPI、それぞれの書き味と使い分けの指針を同じ題材で比べます。

Reanimatedでアニメーションを書く方法は、大きく2つあります。ひとつはuseSharedValueuseAnimatedStyleといったフックを組み合わせるコアAPI、もうひとつはスタイルにプロパティを渡すだけで動くCSSアニメーションAPIです。

どちらか一方だけを覚えれば良い、というものではありません。得意な場面が異なるので、両方を知っておくと、書きたい動きに対して素直な方を選べます。この章では同じ題材を2通りに書き比べ、使い分けの勘どころをつかみます。

同じ動きを2通りで書く

題材として、四角形がふわっと現れる動き(フェードインしながら少し上に移動する)を考えます。

Hooks APIとCSS APIが同じアニメーションへ至る2つの経路を示す図

外部の値に追従するHooks APIと、キーフレームを再生するCSS APIでは、同じ見た目でも組み立て方が異なります。

まずはコアAPIです。共有値を用意し、useAnimatedStyleの中でその値からスタイルを組み立て、表示のタイミングでwithTimingを使って目標値へ動かします。

import { useEffect } from 'react';
import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withTiming,
} from 'react-native-reanimated';

function FadeInBox() {
  const progress = useSharedValue(0);

  const animatedStyle = useAnimatedStyle(() => ({
    opacity: progress.value,
    transform: [{ translateY: (1 - progress.value) * 20 }],
  }));

  useEffect(() => {
    progress.value = withTiming(1, { duration: 500 });
  }, []);

  return <Animated.View style={[styles.box, animatedStyle]} />;
}

progressという0から1へ動く値を一本用意し、そこから不透明度と位置を導いています。値がひとつあれば、それを起点に複数のスタイルを連動させられるのがコアAPIの考え方です。

次に、同じ動きをCSSアニメーションAPIで書いてみます。

import Animated from 'react-native-reanimated';

const fadeIn = {
  from: {
    opacity: 0,
    transform: [{ translateY: 20 }],
  },
  to: {
    opacity: 1,
    transform: [{ translateY: 0 }],
  },
};

function FadeInBox() {
  return (
    <Animated.View
      style={{
        ...styles.box,
        animationName: fadeIn,
        animationDuration: '500ms',
      }}
    />
  );
}

開始と終了の見た目をキーフレームとして書き、あとはanimationNameanimationDurationをスタイルに渡すだけです。共有値もフックも登場しません。コンポーネントが表示された瞬間に、アニメーションが自分から動きはじめます。

Webでブラウザの@keyframesを書いたことがあれば、考え方はほとんど同じだと感じるのではないでしょうか。宣言的に「こう動く」と書けば、あとはReanimatedがキーフレームの間を補間して再生してくれます。

どちらを選ぶか

2つのコードを見比べると、書き味の違いがはっきりします。

CSSアニメーションAPIは、動きがあらかじめ決まっていて、それ自体で完結している場合に向いています。ローディングスピナー、脈打つバッジ、注意を引くための繰り返しの動きなど、外からの入力を必要としない自己完結した動きです。公式ドキュメントも、こうした宣言的なアニメーションではCSSアニメーションAPIを最初の選択肢として勧めています。

一方コアAPIは、値に駆動される動きに向いています。指のドラッグ量やスクロール位置といった、刻々と変わる生きた値にアニメーションを追従させたいとき。あるいは複数の値を組み合わせて、フレーム単位で細かく制御したいとき。こうした場面では、共有値を起点に据えるコアAPIが力を発揮します。公式ドキュメントも、ジェスチャー駆動やスクロール駆動、ライブな値から組み立てる動きにはuseAnimatedStyleを使うよう案内しています。

指針をひとことで言えば、宣言的に書けて完結するならCSS、値に駆動されジェスチャーと連動するならHooks、となります。迷ったら、まず動かしたいものが「決まった動きを再生する」のか「変わり続ける値に追従する」のかを考えてみてください。それが選択の分かれ目になります。

この本での扱い

本書では、まず第2部でコアAPIをじっくり身につけます。共有値とworkletという土台の上に、値駆動のアニメーションを組み立てていく流れは、Reanimatedの中心的な考え方だからです。ジェスチャーやスクロールと連動させる第3部も、このコアAPIが主役になります。

CSSアニメーションAPIは、第5部であらためてまとめて扱います。この章のCSSアニメーションのコード例は本書のデモには載せていません。実際に動くデモは第5部で用意します。

この章のもとになった公式ドキュメント