サイトアイコン 【TechGrowUp】

Flutter開発入門52 FlutterでAnimationControllerの使い方

はじめに

アニメーションは、アプリケーションにインタラクティブ性や視覚的な魅力を加える強力なツールです。Flutterでは、AnimationControllerを使って高度なアニメーションを簡単に作成できます。このチュートリアルでは、AnimationControllerの基本的な使い方を紹介し、シンプルなアニメーションをFlutterで実装する方法を詳しく解説します。

AnimationControllerは、アニメーションの進行状態を管理するために使用され、タイムラインのようにアニメーションを再生・停止・逆再生することが可能です。この記事を読めば、Flutterアプリにアニメーションを加える方法が理解でき、視覚的な要素を強化する手法を身につけることができます。

AnimationControllerとは

AnimationControllerは、Flutterのアニメーションを制御するためのクラスで、アニメーションの進行を管理します。このコントローラーは、指定した期間に渡って0から1までの値を生成し、アニメーションの再生、停止、逆再生、ループなどを制御します。AnimationControllerを使うことで、簡単なアニメーションから複雑なアニメーションまで幅広く作成できます。

主な特徴

AnimationControllerを使ったアニメーションの基本

AnimationControllerのセットアップ

まず、AnimationControllerを使ってシンプルなアニメーションを作成する準備を行います。AnimationControllerは、TickerProviderStateMixinを使用してライフサイクルに合わせて適切に管理します。

基本的なコード例
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AnimationExample(),
    );
  }
}

class AnimationExample extends StatefulWidget {
  @override
  _AnimationExampleState createState() => _AnimationExampleState();
}

class _AnimationExampleState extends State<AnimationExample> with TickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,  // TickerProvider
    )..repeat(reverse: true);  // アニメーションの繰り返し
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimationController Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (context, child) {
            return Transform.scale(
              scale: _controller.value + 1,  // 値の範囲を1-2にする
              child: child,
            );
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        ),
      ),
    );
  }
}

解説

Tweenを使ったアニメーションの強化

次に、Tweenを使って値の範囲を指定することで、アニメーションの動きをさらにカスタマイズする方法を見てみましょう。

Tweenの基本

Tweenを使えば、数値の変化を任意の範囲で制御できます。たとえば、アニメーションの進行に応じて色や位置、サイズなどを変化させることが可能です。

Tweenを使ったサンプルコード

class _AnimationExampleState extends State<AnimationExample> with TickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Color?> _colorAnimation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 3),
      vsync: this,
    )..repeat(reverse: true);

    _colorAnimation = ColorTween(begin: Colors.blue, end: Colors.red).animate(_controller);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Color Tween Animation Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (context, child) {
            return Container(
              width: 100,
              height: 100,
              color: _colorAnimation.value,  // 色をアニメーション
            );
          },
        ),
      ),
    );
  }
}

解説

AnimationControllerを使ったその他の操作

アニメーションの停止・再開

AnimationControllerを使えば、アニメーションの再生や停止も簡単に制御できます。以下のメソッドを使用して、アニメーションをコントロールします。

FloatingActionButton(
  onPressed: () {
    if (_controller.isAnimating) {
      _controller.stop();
    } else {
      _controller.forward();
    }
  },
  child: Icon(Icons.play_arrow),
)

ループアニメーション

repeat()メソッドを使うことで、アニメーションを無限に繰り返すことができます。また、reverse: trueを指定すれば、逆方向にもアニメーションを実行します。

まとめ

AnimationControllerを使えば、Flutterで高度なアニメーションを簡単に作成できます。今回紹介した基本的なスケーリングアニメーションやTweenによる色の変化は、アプリに動的な要素を加えるための基本的な方法です。

アニメーションは、アプリにインタラクティブなフィードバックを与える強力なツールです。AnimationControllerTweenを活用して、より洗練されたアニメーションをFlutterアプリに追加してみてください。

モバイルバージョンを終了