0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FlutterでHeroアニメーションを実装してみた

Posted at

Heroアニメーションとは

Heroアニメーションとは、画面遷移時に同じ画像をサイズ比率を変えるなどのアニメーションを加えることで、シームレスな画面遷移を実現するためのアニメーションです。
例えば、ECサイトにおいて、お店のアイコンが並んでおり、クリックするとアイコンがそのまま大きくなり、詳細説明ページが表示されるような時に利用します。

サンプル

hero_flutter.gif

実装

Hero widgetは呼び出し元と呼び出し先のアイコンと呼び出し先ページのアイコンそれぞれをWrapします。
呼び出し元と呼び出し先の紐付けはtagプロパティにて行っており、それぞれにおいて一致するように実装します。
例のように、Hero widgetを利用する際は引数にtagとpathを持たせることが多いと思います。

# 呼び出し元 Hero Widget
class _MyHomePageStaete extends State<MyHomePage> {
.... 省略 ....
          Hero(
            tag: "マクドナルド",
            child: Container(
              height: 100.0,
              width: 100.0,
              decoration: BoxDecoration(
                  image: DecorationImage(
                      image: AssetImage("images/logo.jpg"), fit: BoxFit.fill)),
              child: FlatButton(
                onPressed: () {
                  # Popup widgetを呼び出す。
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => Popup("man", "images/logo.jpg"),
                    ),
                  );
                },
              ),
            ),
          ),
.... 省略 ....
}

class Popup extends StatelessWidget {
  final String tag;
  final String imagePath;
  Popup(this.tag, this.imagePath);
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: Center(
        child: Column(
          children: <Widget>[
            Expanded(
              flex: 7,
              child: Hero(
                tag: tag,
                child: Container(
                  height: 400.0,
                  width: 400.0,
                  decoration: BoxDecoration(
                      image: DecorationImage(image: AssetImage(imagePath))),
                  child: FlatButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                  ),
                ),
              ),
            ),
            Expanded(
              flex: 3,
              child: Text("This tag is " + tag),
            ),
          ],
        ),
      ),
    );
  }

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?