🐷

【Flutter Widget of the Week #4】AnimatedContainerを使ってみた

2022/09/23に公開

はじめに

Flutter Widget of the Week #4 AnimatedContainer についてまとめましたので、紹介します。
https://youtu.be/yI-8QHpGIP4

AnimatedContainerとは

AnimatedContainer とはその名の通りアニメーションをつけられる Container のことです。
指定した時間に対して徐々に値が変わり、色やサイズ、位置などが変化し、まるで動いているように見せることができます。
この Widget で実行できるアニメーションはいくつかあるので以下で実際に使ってみましょう。

サンプル

まずは公式ドキュメントにもあるタップするとheight, width, color および配置が変化するサンプルを実行してみます。
コードは下の「Flutter」をタップすると表示されます。

このサンプルの中身をみてみましょう。

AnimatedContainer を見ると三項演算子で色やサイズ、位置などの指定をしています。

三項演算子
main.dart
class _AnimatedContainerSampleState extends State<AnimatedContainerSample> {
  bool selected = false;

  
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selected = !selected;
        });
      },
      child: Center(
        child: AnimatedContainer(
          width: selected ? 200.0 : 100.0,
          height: selected ? 100.0 : 200.0,
          color: selected ? Colors.red : Colors.blue,
          alignment:
              selected ? Alignment.center : AlignmentDirectional.topCenter,
          duration: const Duration(seconds: 2),
          curve: Curves.fastOutSlowIn,
          child: const FlutterLogo(size: 75),
        ),
      ),
    );
  }
}

アプリ起動時は bool型の selected が false のため、Container の width(横幅)が100.0, height(縦幅)が200.0, color(色)が青となり、 Container 内にある FlutterLogo の alignment(整列)は上部の真ん中になります。
次に Container をタップすると selected が true に変わるため、Container の width(横幅)が200.0, height(縦幅)が100.0, color(色)が赤となり、 Container 内にある FlutterLogo の alignment(整列)は真ん中に 配置されます。
もう一度タップすると selected が false に、さらにタップすると selected が true に・・・のように タップするたびに selected の値が変わり、それと一緒に Container の形や色、FlutterLogo の配置が変わるようになります。
アニメーションの動きとしては,curve に指定されている Curves.fastOutSlowIn のような変化の仕方をします。(以下参照)
Curves.fastOutSlowIn

他には移動や軸の回転、拡大縮小のアニメーションを作成することができます。

移動

移動アニメーションは transform プロパティに
Matrix4.translationValues(x軸の位置, y軸の位置, z軸の位置))
を入れることで作れます。
右下の FloatingActionButton をタップすることでアニメーションが開始されます。

軸の回転

軸の回転アニメーションは transform プロパティに
Matrix4.rotationZ(z軸での回転角度)
を入れることで作れます。
z軸以外にx軸とy軸の回転もできます。
Matrix4.rotationX(x軸での回転角度)
Matrix4.rotationY(y軸での回転角度)
右下の FloatingActionButton をタップすることでアニメーションが開始されます。

拡大縮小

拡大縮小アニメーションは transform プロパティに
Matrix4.diagonal3Values(x軸, y軸, z軸)
を入れることで作れます。それぞれの引数に入れた数字分倍のサイズになります。
右下の FloatingActionButton をタップすることでアニメーションが開始されます。

アニメーションの種類

アニメーションの動きには Curves.fastOutSlowIn 以外にも 40種類以上のアニメーションがあります。いくつか見てみましょう。
コードは最初のサンプルをもとに AnimatedContainer プロパティを変更したものになってます。

Curves.bounceIn

アニメーションの仕方
Curves.bounceIn

Curves.elasticIn

アニメーションの仕方
Curves.elasticIn

Curves.linear

アニメーションの仕方
Curves.elasticIn

Curves.easeInCirc

アニメーションの仕方
Curves.elasticIn

最後に

今回は AnimatedContainer を紹介しました。アニメーションを一つ入れるだけで見た目が違って見えるので、効果的に使っていきたいですね。
次は #5 Opacity です。またお会いしましょう。

参考記事

https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html

合わせて読みたい

https://medium.com/flutter-jp/implicit-animation-b9d4b7358c28

Discussion