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

下にスワイプして閉じる Swipe Down to Dismiss

全画面の写真を下へ払うと、写真が縮みながら離れていき、背景が透けて元の一覧に戻る。

別名
下に払って閉じる写真ビューアを閉じるドラッグして閉じるPull to DismissDrag to Dismiss
動き
下へ払う縮みながら離れる背景が透ける
作り方
自作 標準ウィジェットの組み合わせで自分で作ります

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

別タブで大きく開く ↗

どんなもの?

写真アプリや SNS の画像ビューアで、×ボタンを探さなくても閉じられる操作です。

写真を GestureDetector の onVerticalDragUpdate で指に合わせて動かし、

ずらした量に応じて写真を縮め、黒い背景を薄くしていきます(後ろの一覧が見えてくる)。

離したとき、一定以上動いたか勢いよく払った(速度が大きい)なら閉じ、足りなければ元の位置へ戻します。

こんなときに

  • 全画面の写真・動画ビューア

避けたい場面

  • 中身を縦にスクロールする画面(スクロールと取り合いになる)

最小コード

GestureDetector(
  onVerticalDragUpdate: (d) => drag.value += d.delta.dy,
  onVerticalDragEnd: (d) {
    final fast = (d.primaryVelocity ?? 0) > 700;
    if (drag.value > 120 || fast) {
      close();
    } else {
      drag.animateTo(0, curve: Curves.easeOutBack); // 元へ戻る
    }
  },
  child: AnimatedBuilder(
    animation: drag,
    builder: (context, child) => Transform.translate(
      offset: Offset(0, drag.value),
      child: Transform.scale(scale: 1 - progress * 0.5, child: child),
    ),
    child: photo,
  ),
)

使うウィジェット

GestureDetector(onVerticalDrag)AnimationControllerTransform

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

触ってみる ↗
ダイアログ・シート モーダルボトムシートModal Bottom Sheet

画面の下から板がせり上がってきて、選択肢や小さなフォームを出す。外側を押すか下に引くと閉じる。

下から出てくる
触ってみる ↗
ジェスチャー スワイプで削除Swipe to Dismiss

リストの行を横にスワイプすると、下から色付きの背景が現れ、そのまま行が消える。

横にスワイプ