123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import 'package:flutter/material.dart';
- enum TransitionType {
- inFromLeft,
- inFromRight,
- inFromTop,
- inFromBottom,
- scale,
- fade,
- rotation,
- size,
- }
- Future<T?> showAnimationDialog<T>({
- required BuildContext context,
- bool barrierDismissible = true,
- Widget? child,
- required WidgetBuilder builder,
- bool useRootNavigator = true,
- RouteSettings? routeSettings,
- TransitionType transitionType = TransitionType.fade,
- }) {
- 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 Theme(data: theme, child: pageChild,
- );
- },
- barrierDismissible: barrierDismissible,
- barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
- barrierColor: Colors.transparent,
- transitionDuration: const Duration(milliseconds: 200),
- transitionBuilder: (context, animation1, animation2, child) {
- return _buildDialogTransitions(context, animation1, animation2, child, transitionType);
- },
- 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.fastOutSlowIn)),
- 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 SizeTransition(
- child: child,
- sizeFactor: Tween<double>(begin: 0.1, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.linear)),
- );
- } else {
- return child;
- }
- }
|