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

円形に広がる遷移 Circular Reveal

押した場所を中心に円が広がっていき、その円の中に次の画面が現れる。

別名
サーキュラーリビール波紋で開く円で広がるReveal Animation
動き
押した場所から円が広がる閉じると円が縮む
作り方
自作 標準ウィジェットの組み合わせで自分で作ります

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

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

別タブで大きく開く ↗

どんなもの?

Android で一時期よく使われた「Circular Reveal」の動きです。どこを押したから開いたのかが、はっきり伝わります。

Flutter に専用のウィジェットはないので、PageRouteBuilder の transitionsBuilder で

ClipPath を使い、円の半径をアニメーションに合わせて大きくして作ります。

半径は押した場所から一番遠い角までの距離にすると、最後に画面全体が覆われます。

CustomClipper の reclip にアニメーションを渡すと、動きに合わせて切り抜きが更新されます。

こんなときに

  • ボタンを押して、その色の画面が広がる演出(テーマ切り替え・カメラ起動など)

避けたい場面

  • 何度も行き来する画面(毎回大きく動くので疲れる)

最小コード

class CircleClipper extends CustomClipper<Path> {
  CircleClipper(this.center, this.progress) : super(reclip: progress);
  final Offset center;
  final Animation<double> progress;

  @override
  Path getClip(Size size) {
    final radius = size.longestSide * 1.2 * progress.value;
    return Path()..addOval(Rect.fromCircle(center: center, radius: radius));
  }

  @override
  bool shouldReclip(CircleClipper old) => old.center != center;
}

PageRouteBuilder(
  pageBuilder: (context, a, b) => const NextPage(),
  transitionsBuilder: (context, animation, b, child) =>
      ClipPath(clipper: CircleClipper(tapPosition, animation), child: child),
)

使うウィジェット

PageRouteBuilderClipPathCustomClipper

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

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

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

カードがふくらむ
触ってみる ↗
画面遷移 フェード遷移Fade Transition

画面が動かずに、前の画面が薄れて次の画面が浮かび上がる。いちばん控えめな遷移。

ふわっと入れ替わる