LoginSignup
28
9

More than 3 years have passed since last update.

Rive(旧Flare)でパスモーフィング

Posted at

はじめに

Flutterで利用可能なアニメーションを作成するWebツール、Riveを使ったアニメーション作成例の記事です。この間まで、Flareという名前だったこのツールですが、先日のFlutter Interact '19でRiveに変わりました。

今回はRiveを使って、SVGのPathを変化させるアニメーション(パスモーフィング)を作り、Flutterに組む方法を紹介します。

今回つくったもの

path_morph_01.gif
多角形の頂点数を増やしてアニメーションさせるものです。
4→5→6→7→8と増やしていき、8角形になったら最初の4角形に戻ります。

Riveでの操作

ここからRiveでの操作の説明になります。

はじめの状態の図形を作る


+マークから、作成したい図形を作ります。


はじめの図形の4角形をPolygonで作りました。

pathに変更する


そのままではpathとして扱えないので、CONVERT TO PATHでpathに変換します。


EDIT VERTICESでpath頂点の編集ができます。


4角形をpath化した状態だと上記のようにpathの頂点は4つできます。

pathを変形させるアニメーションではpathの頂点の変化を記述していくため、アニメーション中の頂点数が同じである必要があります。
(参考)https://www.webcreatorbox.com/tech/svg-morphing

今回は4角形→8角形に変化させていくため、頂点数をはじめの図形から8つにしておきます。


上部のPenを選択することで、頂点を増やすことができます。


頂点を8つにしました。

アニメーションを作る

アニメーションの追加/名前設定

タブをANIMATEに移し、アニメーションを作成していきます。
+ボタンでアニメーションの追加ができます。
Untitledという名前で作られますが、ここで指定した名前をFlutterのコード内で指定するので、適切な名前を付けておきます。

◆マークをチェックする

スクリーンショット 2019-12-23 13.28.26.png
変形させたい図形を選択し、右側ペインのEDIT VERTICES横にある、◆マークをチェックします。
◆マークをチェックすることで、ある時間での要素の状態を決めることができます。
ここでは時間00:00:00時点でのpathの形を固定しました。

時間経過後の変形

1秒後に5角形になるようにします。

スクリーンショット 2019-12-23 13.37.49.png
下の時間スライダーを00:01:00に動かし、右側ペインのEDIT VERTICES横にある、◆マークをチェックします。

image.png
EDIT VERTICESで編集し、完了したらDONE EDITINGで保存します。

morph_mac.gif
4角形から5角形の変形ができました。

繰り返し

あとは同じ要領で変形するポイントを追加していきます。
image.png

Flutterに組み込む

Export

Flutterに組み込める形にExportします。
image.png
image.png
右上のボタンよりExportします。FormatはBinaryにします。
.flr形式のファイルがダウンロードされます。

Flutterプロジェクトに配置

image.png
image.png
適当なディレクトリに.flrファイルを配置し、FlareActorで読み込めば、アニメーションが行われます。
FlareActorはこちら (https://pub.dev/packages/rive) をdependenciesに追加することで使えます。中ではflare_flutterに依存していますが、名称変更に伴いラップしたものが用意されたようです。

path_morph_01.gif

UIと協調させる

上の例では多角形の変化をひとつなぎのアニメーションにしました。
次の例では、ボタン押下時に次の形に変形するようにしてみます。

この場合、アニメーションが1つだと難しかったので、複数のアニメーションに分割することで対応できました。

image.png
このように、多角形1つの変化のみのアニメーションを複数作ります。(画像は5角形→6角形のアニメーション)

コードでは、アニメーションの名前を保持しておき、ボタンが押される度に、setStateで使われるanimationを変更するように実装します。

class _AnimationSample02PageState extends State<AnimationSample02Page> {
  final List<String> _animations = [
    '4_to_5',
    '5_to_6',
    '6_to_7',
    '7_to_8',
    '8_to_4',
  ];

  int _animationIndex;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animation Sample 02'),
      ),
      body: Column(
        children: <Widget>[
          ()
                child: FlareActor(
                  'images/path_morph.flr',
                  fit: BoxFit.contain,
                  animation: _animationIndex != null
                      ? _animations[_animationIndex]
                      : null,
                ),
          (/)
          ,
          FloatingActionButton(
            child: Icon(Icons.autorenew),
            onPressed: () {
              setState(() {
                if (_animationIndex == null ||
                    _animationIndex == _animations.length - 1) {
                  _animationIndex = 0;
                } else {
                  _animationIndex++;
                }
              });
            },
          )
        ],
      ),
    );
  }
}

完成

path_morph_tap.gif

さいごに

Riveを使って作ったpathを変化させるアニメーションをFlutterに組み込むことができました。
簡単なアニメーションだけでなく、実践的なアニメーションも作れるよう頑張ります。

今回作成したアニメーション、コードは以下にあります。
* Riveのファイル : https://rive.app/a/iiinaiii/files/flare/path-morph-sample-02/preview
* Flutterコード : https://github.com/iiinaiii/Flutter-UI-Samples/blob/master/lib/ui/animation_sample_02.dart

参考

https://www.webcreatorbox.com/tech/svg-morphing
https://rive.app/a/nimbbble/files/flare/morphing/preview

28
9
2

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
28
9