web_synchronization_tool/lib/windows/show_animation_utils.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;
}
}