FlutterとSEO、ときどき仕事

Dart, flutter

【Flutter】フリップアニメーションの作り方

本記事ではフリップアニメーション(カードを回転させるようなアニメーション)をFlutterで実現する方法を紹介します。

flip_cardの導入

今回は外部ライブラリのflip_cardを使います。

参考:【Flutter】パッケージの追加方法【初心者向け】

サンプル

カード(テキスト)を表示し、FloatingActionButtonを押すとカードを回転させるようなサンプルになっています。

FlipCardのWidgetを生成し、以下のパラメタを必要に応じて設定します

  • controller: 回転を管理するコントローラーを設定
    • import ‘package:flip_card/flip_card_controller.dart’;
    • FlipCardController _controller = FlipCardController();
  • flipOnTouch: タッチで回転させるかどうか(デフォルトtrue)
    • true/false
  • direction: // 回転の向きを指定
    • FlipDirection.HORIZONTAL
    • FlipDirection.VERTICAL
  • speed: 回転速度を指定(デフォルト500)
  • front: 表を構成するWidget
  • back: 裏を構成するWidget
import 'package:flip_card/flip_card_controller.dart';
import 'package:flutter/material.dart';
import 'package:flip_card/flip_card.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  FlipCardController _controller = FlipCardController(); // 回転を管理するコントローラーを生成
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlipCard(
              controller: _controller, // 回転を管理するコントローラーを設定
              flipOnTouch: false, // タッチで回転しないようにする
              direction: FlipDirection.HORIZONTAL, // 回転の向きを指定(デフォルトHORIZONTAL)
              speed: 500, // 回転速度を指定(デフォルト500)
              front: Container(
                color: Colors.blue,
                child: const Text('front'),
              ),
              back:  Container(
                color: Colors.red,
                child: const Text('back')
              ),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => _controller.toggleCard(),
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

 

コメントを残す