LoginSignup
2
2

More than 3 years have passed since last update.

ReactNativeでSVGアニメーション

Posted at

参考

React NativeでSVGを扱う

今回はreact-native-svgを使う前提

  • ARTというライブラリもあるが、色々試している時にこのエラーが発生して解決しなかった。 react-native-svgのほうが安定して使えた印象。

基本的なアニメーションの流れ

  • SvgやPathなどのタグをAnimationに対応させないと行けない。これを忘るとAnimated.valueを設定しても反映されない。ちょっとハマる。

//使う要素を 順次以下のようにAnimatedに対応させる
const AnimatedSvg = Animated.createAnimatedComponent(Svg);
const AnimatedPath = Animated.createAnimatedComponent(Path);
const AnimatedCircle = Animated.createAnimatedComponent(Circle);

  • 他の要素と同じように、Animated.value()を設定して、任意のタイミングでこの値を変動させることで実現する。stateの持たせるのがわかりやすいか。Svgでははfill(塗りつぶし色)やstroke(線)、opacityなどをpropとして指定する。普通の要素はstyleに指定したりするので注意。

  • 変動させたい値の数だけ以下の処理が必要

    • Animated.value()の宣言
    • (必要なら)interpolateの設定
    • animationの実行
//宣言
  constructor(props) {
    super(props);
    this.state = {
      checked: false,
      svgScale: new Animated.Value(50),
    };
  }
//_interPolateの設定(cssのkeyframe的に)
    const _interPolateSvgScale = svgScale.interpolate({
      inputRange: [0, 100],
      outputRange: [0.8, 1],
    });

//animationの実行
  _svgScaleAnimation = () => {
    const { checked, svgScale } = this.state
    Animated.timing(svgScale, {
      toValue: checked ? 0 : 100, 
      duration: duration,
      useNativeDriver: false,
    }).start();
  }

  • 場所の移動や回転・サイズ変更などはstyleでtransformを指定する。transform リファレンス 指定できる項目→ decomposedMatrix, rotation, scaleX, scaleY, transformMatrix, translateX, translateY
    const dStyle = {
      transform: [
        { translateY: _interPolateHeartY },
        { scale: _interPolateSvgScale },
        { scaleX: _interPolateHeartTransformX },
        { scaleY: _interPolateHeartTransformY },
      ],
    };

...

    return (
            <AnimatedSvg height={100} width={100} style={dStyle} >


  • cssのkeyframe的に段階的に変化を設定する場合や、色を変化させていく場合は、interpolateを使う。cssで一つのkeyframeで複数のプロパティを指定できるが、reactnativeではanimated.value()一つずつ設定しないといけない。

  • ちあんみにSVG画像を表示する場合はreact-native-svg-uriを使う。この時propで調整出来るのはfillぐらいなので、あまり柔軟なanimationは出来ない..

Pathのサイズ調整する方法

Path自体にはサイズ(height, width)の指定が出来なかった。
SVGタグにheightとwidthを指定してこれを枠とする。
その中にpathを描画すると元々のpathのサイズで描画される。
ここでSVGのviewBoxを調整するとSvgタグの中でpath全体がちょうどよく描画されるように調整することができる。
svgのpathを作成する時も一応使うサイズに合わせて作っておいた方が扱いやすい。

作ったアニメーション

106687664-ec4ddb00-660f-11eb-8c64-992b131f8482.gif

 コード

....CSSで出来ることは一通り出来そうだけど、コード量は増えてしまいそう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2