You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							187 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							187 lines
						
					
					
						
							6.8 KiB
						
					
					
				
								library page_transition;
							 | 
						|
								
							 | 
						|
								import 'package:flutter/material.dart';
							 | 
						|
								
							 | 
						|
								enum PageTransitionType {
							 | 
						|
								  fade,
							 | 
						|
								  rightToLeft,
							 | 
						|
								  leftToRight,
							 | 
						|
								  upToDown,
							 | 
						|
								  downToUp,
							 | 
						|
								  scale,
							 | 
						|
								  rotate,
							 | 
						|
								  size,
							 | 
						|
								  rightToLeftWithFade,
							 | 
						|
								  leftToRightWithFade,
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								class PageTransition<T> extends PageRouteBuilder<T> {
							 | 
						|
								  final Widget child;
							 | 
						|
								  final PageTransitionType type;
							 | 
						|
								  final Curve curve;
							 | 
						|
								  final Alignment alignment;
							 | 
						|
								  final Duration duration;
							 | 
						|
								
							 | 
						|
								  PageTransition({
							 | 
						|
								    Key key,
							 | 
						|
								    @required this.child,
							 | 
						|
								    @required this.type,
							 | 
						|
								    this.curve = Curves.linear,
							 | 
						|
								    this.alignment,
							 | 
						|
								    this.duration = const Duration(milliseconds: 300),
							 | 
						|
								  }) : super(
							 | 
						|
								            pageBuilder: (BuildContext context, Animation<double> animation,
							 | 
						|
								                Animation<double> secondaryAnimation) {
							 | 
						|
								              return child;
							 | 
						|
								            },
							 | 
						|
								            transitionDuration: duration,
							 | 
						|
								            transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
							 | 
						|
								              switch (type) {
							 | 
						|
								                case PageTransitionType.fade:
							 | 
						|
								                  return FadeTransition(opacity: animation, child: child);
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.rightToLeft:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    transformHitTests: false,
							 | 
						|
								                    position: new Tween<Offset>(
							 | 
						|
								                      begin: const Offset(1.0, 0.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: new SlideTransition(
							 | 
						|
								                      position: new Tween<Offset>(
							 | 
						|
								                        begin: Offset.zero,
							 | 
						|
								                        end: const Offset(-1.0, 0.0),
							 | 
						|
								                      ).animate(secondaryAnimation),
							 | 
						|
								                      child: child,
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.leftToRight:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    transformHitTests: false,
							 | 
						|
								                    position: Tween<Offset>(
							 | 
						|
								                      begin: const Offset(-1.0, 0.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: new SlideTransition(
							 | 
						|
								                      position: new Tween<Offset>(
							 | 
						|
								                        begin: Offset.zero,
							 | 
						|
								                        end: const Offset(1.0, 0.0),
							 | 
						|
								                      ).animate(secondaryAnimation),
							 | 
						|
								                      child: child,
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.upToDown:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    transformHitTests: false,
							 | 
						|
								                    position: Tween<Offset>(
							 | 
						|
								                      begin: const Offset(0.0, -1.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: new SlideTransition(
							 | 
						|
								                      position: new Tween<Offset>(
							 | 
						|
								                        begin: Offset.zero,
							 | 
						|
								                        end: const Offset(0.0, 1.0),
							 | 
						|
								                      ).animate(secondaryAnimation),
							 | 
						|
								                      child: child,
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.downToUp:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    transformHitTests: false,
							 | 
						|
								                    position: Tween<Offset>(
							 | 
						|
								                      begin: const Offset(0.0, 1.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: new SlideTransition(
							 | 
						|
								                      position: new Tween<Offset>(
							 | 
						|
								                        begin: Offset.zero,
							 | 
						|
								                        end: const Offset(0.0, -1.0),
							 | 
						|
								                      ).animate(secondaryAnimation),
							 | 
						|
								                      child: child,
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.scale:
							 | 
						|
								                  return ScaleTransition(
							 | 
						|
								                    alignment: alignment,
							 | 
						|
								                    scale: CurvedAnimation(
							 | 
						|
								                      parent: animation,
							 | 
						|
								                      curve: Interval(
							 | 
						|
								                        0.00,
							 | 
						|
								                        0.50,
							 | 
						|
								                        curve: Curves.bounceInOut,
							 | 
						|
								                      ),
							 | 
						|
								                    ),
							 | 
						|
								                    child: child,
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.rotate:
							 | 
						|
								                  return new RotationTransition(
							 | 
						|
								                    alignment: alignment,
							 | 
						|
								                    turns: animation,
							 | 
						|
								                    child: new ScaleTransition(
							 | 
						|
								                      alignment: alignment,
							 | 
						|
								                      scale: animation,
							 | 
						|
								                      child: FadeTransition(
							 | 
						|
								                        opacity: animation,
							 | 
						|
								                        child: child,
							 | 
						|
								                      ),
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.size:
							 | 
						|
								                  return Align(
							 | 
						|
								                    alignment: alignment,
							 | 
						|
								                    child: SizeTransition(
							 | 
						|
								                      sizeFactor: CurvedAnimation(
							 | 
						|
								                        parent: animation,
							 | 
						|
								                        curve: curve,
							 | 
						|
								                      ),
							 | 
						|
								                      child: child,
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.rightToLeftWithFade:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    position: Tween<Offset>(
							 | 
						|
								                      begin: const Offset(1.0, 0.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: FadeTransition(
							 | 
						|
								                      opacity: animation,
							 | 
						|
								                      child: SlideTransition(
							 | 
						|
								                        position: Tween<Offset>(
							 | 
						|
								                          begin: Offset.zero,
							 | 
						|
								                          end: const Offset(-1.0, 0.0),
							 | 
						|
								                        ).animate(secondaryAnimation),
							 | 
						|
								                        child: child,
							 | 
						|
								                      ),
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                case PageTransitionType.leftToRightWithFade:
							 | 
						|
								                  return SlideTransition(
							 | 
						|
								                    position: Tween<Offset>(
							 | 
						|
								                      begin: const Offset(-1.0, 0.0),
							 | 
						|
								                      end: Offset.zero,
							 | 
						|
								                    ).animate(animation),
							 | 
						|
								                    child: FadeTransition(
							 | 
						|
								                      opacity: animation,
							 | 
						|
								                      child: SlideTransition(
							 | 
						|
								                        position: Tween<Offset>(
							 | 
						|
								                          begin: Offset.zero,
							 | 
						|
								                          end: const Offset(1.0, 0.0),
							 | 
						|
								                        ).animate(secondaryAnimation),
							 | 
						|
								                        child: child,
							 | 
						|
								                      ),
							 | 
						|
								                    ),
							 | 
						|
								                  );
							 | 
						|
								                  break;
							 | 
						|
								                default:
							 | 
						|
								                  return FadeTransition(opacity: animation, child: child);
							 | 
						|
								              }
							 | 
						|
								            });
							 | 
						|
								}
							 | 
						|
								
							 |