個人開発者が勉強がてらまとめているだけのサイトです

Hero(共有要素の遷移) Hero Animation

一覧の小さな写真が、そのまま飛んでいって次の画面の大きな写真になる。同じ物だとひと目で分かる。

別名
共有要素遷移シェアードエレメント画像が飛ぶ遷移Shared Element TransitionMagic Move
動き
要素が飛んでいく小さい絵が大きくなる戻ると元の場所へ
作り方
標準ウィジェット Flutter に入っているものだけで作れます

本物の Flutter ウィジェットが動きます(初回は数秒かかります)

※ 動画は動きが分かるよう 1/2 の速さです。「触ってみる」は実際の速さで動きます

別タブで大きく開く ↗

どんなもの?

2つの画面に同じ物が出てくるとき、その物を画面をまたいで動かす遷移です。「この写真の詳細を開いた」ことが自然に伝わります。

両方の画面で同じ tag を付けた Hero で包むだけで、Flutter が位置と大きさを補間して飛ばしてくれます。

tag は画面内で重複しない値(ID など)にすること。重複するとエラーになります。

入れ子の Navigator で使うときは、observers に HeroController を渡さないと飛びません。

こんなときに

  • 一覧の写真・アイコンを、詳細で大きく見せる
  • 同じ物を別の画面で続けて扱うことを伝えたい

避けたい場面

  • 飛ぶ物が画面に複数あり、どれが主役か分からなくなる

最小コード

// 一覧
ListTile(
  leading: Hero(tag: photo.id, child: Image.network(photo.thumbUrl)),
  onTap: () => Navigator.of(context).push(
    MaterialPageRoute(builder: (_) => PhotoPage(photo)),
  ),
)

// 詳細(同じ tag)
Hero(tag: photo.id, child: Image.network(photo.url))

使うウィジェット

Hero

似ているもの・一緒に見たいもの

触ってみる ↗
画面遷移 コンテナトランスフォームContainer Transform

押したカードがその場でふくらみ、角を広げながら画面いっぱいの詳細画面に変わる。閉じるとカードに縮んで戻る。

カードがふくらむ
触ってみる ↗
画面遷移 iOS 風プッシュCupertino Page Transition

次の画面が右から滑り込み、前の画面は少しだけ左へずれて暗くなる。iPhone のアプリでおなじみの動き。

右から入る