148 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
| 
 | |
| import 'package:flutter/material.dart';
 | |
| 
 | |
| enum TransitionType {
 | |
|   ///左侧弹出
 | |
|   inFromLeft,
 | |
|   ///右侧弹出
 | |
|   inFromRight,
 | |
|   ///顶部弹出
 | |
|   inFromTop,
 | |
|   ///底部弹出
 | |
|   inFromBottom,
 | |
|   ///缩放
 | |
|   scale,
 | |
|   ///渐变
 | |
|   fade,
 | |
|   ///旋转缩放
 | |
|   rotation,
 | |
|   ///放大
 | |
|   size,
 | |
| }
 | |
| 
 | |
| 
 | |
|   //弹出动画
 | |
|   // barrierDismissible:点击背景是否消失
 | |
|   // child,builder:子 widget
 | |
|   // useRootNavigator: 是否推入传入 context的 导航器
 | |
|   // routeSettings: 弹窗路由设置
 | |
|   Future<T?> showAnimationDialog<T>({
 | |
|     required BuildContext context,
 | |
|     bool barrierDismissible = true,
 | |
|     Widget? child,
 | |
|     WidgetBuilder? builder,
 | |
|     bool useRootNavigator = true,
 | |
|     RouteSettings? routeSettings,
 | |
|     TransitionType? transitionType,
 | |
|   }) {
 | |
|     assert(child == null || builder == null);
 | |
|     assert(debugCheckHasMaterialLocalizations(context));
 | |
| 
 | |
|     final ThemeData theme = Theme.of(context);
 | |
|     return showGeneralDialog(
 | |
|       context: context,
 | |
|       pageBuilder: (BuildContext buildContext, Animation<double> animation, Animation<double> secondaryAnimation) {
 | |
|         final Widget pageChild = child ?? Builder(builder: builder!);
 | |
|         return SafeArea(
 | |
|           child: Builder(builder: (BuildContext context) {
 | |
|             return Theme(data: theme, child: pageChild);
 | |
|           }),
 | |
|         );
 | |
|       },
 | |
|       barrierDismissible: barrierDismissible, ///点击背景是否消失
 | |
|       barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
 | |
|       barrierColor: Colors.black38, ///背景色
 | |
|       transitionDuration: const Duration(milliseconds: 200),///动画时间
 | |
|       transitionBuilder: (context, animation1, animation2, child) { ///动画效果
 | |
|         return _buildDialogTransitions(context, animation1, animation2, child, transitionType?? TransitionType.inFromBottom);
 | |
|       },
 | |
|       useRootNavigator: useRootNavigator,
 | |
|       routeSettings: routeSettings,
 | |
|     );
 | |
|   }
 | |
| 
 | |
| 
 | |
|   ///返回动画效果
 | |
|   Widget _buildDialogTransitions(
 | |
|       BuildContext context, Animation<double> animaton1, Animation<double> secondaryAnimation, Widget child, TransitionType type) {
 | |
| 
 | |
|     /// 渐变效果
 | |
|     if (type == TransitionType.fade) {
 | |
|       return FadeTransition(
 | |
|         // 从0开始到1
 | |
|         opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
 | |
|           // 传入设置的动画
 | |
|           parent: animaton1,
 | |
|           // 设置效果,快进漫出   这里有很多内置的效果
 | |
|           curve: Curves.fastOutSlowIn,
 | |
|         )),
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       ///缩放
 | |
|     } else if (type == TransitionType.scale) {
 | |
|       return ScaleTransition(
 | |
|         scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.easeOutBack)),//Curves.easeOutBack
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       /// 旋转加缩放动画效果
 | |
|     } else if (type == TransitionType.rotation) {
 | |
| 
 | |
|       return RotationTransition(
 | |
|         turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
 | |
|           parent: animaton1,
 | |
|           curve: Curves.fastOutSlowIn,
 | |
|         )),
 | |
|         child: ScaleTransition(
 | |
|           scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|           child: child,
 | |
|         ),
 | |
|       );
 | |
| 
 | |
|       /// 左滑出动画效果
 | |
|     } else if (type == TransitionType.inFromLeft) {
 | |
| 
 | |
|       return SlideTransition(
 | |
|         position: Tween<Offset>(begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0))
 | |
|             .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       /// 右滑出动画效果
 | |
|     } else if (type == TransitionType.inFromRight) {
 | |
|       return SlideTransition(
 | |
|         position: Tween<Offset>(begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0))
 | |
|             .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       /// 顶部滑出动画效果
 | |
|     } else if (type == TransitionType.inFromTop) {
 | |
|       return SlideTransition(
 | |
|         position: Tween<Offset>(begin: Offset(0.0, -1.0), end: Offset(0.0, 0.0))
 | |
|             .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       /// 底部滑出动画效果
 | |
|     } else if (type == TransitionType.inFromBottom) {
 | |
|       return SlideTransition(
 | |
|         position: Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0))
 | |
|             .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|         child: child,
 | |
|       );
 | |
| 
 | |
|       /// 放大出显动画效果
 | |
|     } else if (type == TransitionType.size) {
 | |
|       return ScaleTransition(
 | |
|         child: child,
 | |
|         scale: Tween<double>(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)),
 | |
|       );
 | |
|     } else {
 | |
|       return child;
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 |