[Flutter]Containerを動かすアニメーションをする方法

Flutter

どうも、ちょげ(@chogetarou)です。

Containerを動かすアニメーションをする方法を紹介します。

スポンサーリンク

方法

Containerを動かすアニメーションをするには、AnimatedPositionとStackを使います。

まず、位置を切り替えるための変数を用意します。

var _isChanged = false;

次に、Stackを用意します。

Stack(
  children: [],
),

そして、AnimatedPositionedをStackのchildrenに指定します。

この時、引数「duration」にアニメーションの時間を設定します。

Stack(
  children: [
    AnimatedPositioned(
      duration: Duration(/*アニメーションの時間*/),
      child: Container(),
    ),
  ],
),

次に、AnimatedPositionedの次のいずれかの引数と用意した変数を使い、Containerの位置が切り替わるようにします。

  • left : 左からの距離
  • top : 上からの距離
  • bottom : 下からの距離
  • right : 右からの距離

ここでは、左上から位置を指定するために、引数「top」と引数「left」を使います。

Stack(
  children: [
    AnimatedPositioned(
      left: _isChanged ? /*移動後の位置*/ : /*移動前の位置*/,
      top: _isChanged ? /*移動後の位置*/ : /*移動前の位置*/,
      duration: Duration(/*アニメーションの時間*/),
      child: Container(),
    ),
  ],
),

後は、ボタンなどで変数の値を切り替える処理をします。

ElevatedButton(
  onPressed: () {
    setState(() {
      _isChanged = !_isChanged;
    });
  },
  child: Text('Move'),
),

これでContainerを動かすアニメーションをすることが出来ます。

以下は、使用例です。

使用例
class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var _isChanged = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          AnimatedPositioned(
            left: _isChanged ? 180 : 0,
            top: _isChanged ? 650 : 0,
            duration: Duration(seconds: 2),
            child: Container(
              height: 200,
              width: 200,
              color: Colors.blue,
            ),
          ),
          Align(
            alignment: Alignment.center,
            child: ElevatedButton(
              onPressed: () {
                setState(() {
                  _isChanged = !_isChanged;
                });
              },
              child: Text('Move'),
            ),
          )
        ],
      ),
    );
  }
}

コメント

タイトルとURLをコピーしました