From 2574ffc2f09feb18fddd3890c10fe69ac0db8f65 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Thu, 29 Feb 2024 21:33:14 +0100 Subject: [PATCH] Improved circle page transition --- lib/screens/bookmarks/ui/bookmarks.dart | 2 +- lib/widgets/circle_page_transition.dart | 67 ++++++++++++++----------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/lib/screens/bookmarks/ui/bookmarks.dart b/lib/screens/bookmarks/ui/bookmarks.dart index 63655ed..77a0644 100644 --- a/lib/screens/bookmarks/ui/bookmarks.dart +++ b/lib/screens/bookmarks/ui/bookmarks.dart @@ -73,7 +73,7 @@ class _List extends ConsumerWidget { RenderBox box = _searchButtonKey.currentContext!.findRenderObject() as RenderBox; Offset position = box.localToGlobal(Offset.zero); Navigator.of(context, rootNavigator: true).push( - circlePageBuilder( + CirclePageRoute( page: const SearchBookmarksModal(fullscreen: true), beginPosition: Offset(position.dx + 20, position.dy + 20), ), diff --git a/lib/widgets/circle_page_transition.dart b/lib/widgets/circle_page_transition.dart index ecdda84..deef076 100644 --- a/lib/widgets/circle_page_transition.dart +++ b/lib/widgets/circle_page_transition.dart @@ -1,35 +1,44 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/cupertino.dart'; -Route circlePageBuilder({ - required Widget page, - required Offset beginPosition, - bool? fullScreenDialog, - Duration? transitionDuration, -}) { - return PageRouteBuilder( - pageBuilder: (context, animation, secondaryAnimation) => page, - transitionDuration: transitionDuration ?? const Duration(milliseconds: 250), - reverseTransitionDuration: transitionDuration ?? const Duration(milliseconds: 250), - fullscreenDialog: fullScreenDialog ?? false, - transitionsBuilder: (context, animation, secondaryAnimation, child) { - const double beganRadius = 0.0; - final size = MediaQuery.of(context).size; - final double endRadius = size.height > size.width ? size.height * 1.2 : size.width * 1.2; +class CirclePageRoute extends PageRouteBuilder { + final Widget page; + final Offset beginPosition; - final radiusTweenAnimation = animation.drive( - Tween(begin: beganRadius, end: endRadius), - ); + CirclePageRoute({ + required this.page, + required this.beginPosition, + }) : super( + pageBuilder: ( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + ) => + page, + ); - return ClipPath( - clipper: _CircleTransitionClipper( - center: beginPosition, - radius: radiusTweenAnimation.value, - ), - child: child, - ); - }, - ); + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + const double beganRadius = 0.0; + final size = MediaQuery.of(context).size; + final double endRadius = size.height > size.width ? size.height * 1.2 : size.width * 1.2; + + final radiusTweenAnimation = animation.drive( + Tween(begin: beganRadius, end: endRadius), + ); + + return ClipPath( + clipper: _CircleTransitionClipper( + center: beginPosition, + radius: radiusTweenAnimation.value, + ), + child: child, + ); + } } class _CircleTransitionClipper extends CustomClipper {