Skip to content

Commit

Permalink
#75: separation animation
Browse files Browse the repository at this point in the history
  • Loading branch information
xdd666t committed Aug 29, 2022
1 parent 143f413 commit a41123b
Show file tree
Hide file tree
Showing 17 changed files with 731 additions and 426 deletions.
1 change: 0 additions & 1 deletion lib/flutter_smart_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export 'src/config/smart_config_attach.dart';
export 'src/config/smart_config_custom.dart';
export 'src/config/smart_config_loading.dart';
export 'src/config/smart_config_toast.dart';

/// dialog
export 'src/init_dialog.dart';
export 'src/smart_dialog.dart';
Expand Down
8 changes: 0 additions & 8 deletions lib/src/data/location.dart

This file was deleted.

2 changes: 1 addition & 1 deletion lib/src/helper/dialog_proxy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import 'package:flutter_smart_dialog/src/data/dialog_info.dart';
import 'package:flutter_smart_dialog/src/widget/attach_dialog_widget.dart';
import 'package:flutter_smart_dialog/src/widget/toast_helper.dart';

import '../config/smart_config.dart';
import '../config/enum_config.dart';
import '../config/smart_config.dart';
import '../init_dialog.dart';
import '../widget/smart_overlay_entry.dart';

Expand Down
2 changes: 1 addition & 1 deletion lib/src/init_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class FlutterSmartDialog extends StatefulWidget {
class _FlutterSmartDialogState extends State<FlutterSmartDialog> {
@override
void initState() {
ViewUtils.addPostFrameCallback((timeStamp) {
ViewUtils.addSafeUse(() {
try {
var navigator = widget.child as Navigator;
var key = navigator.key as GlobalKey;
Expand Down
2 changes: 1 addition & 1 deletion lib/src/smart_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import 'dart:async';
import 'package:flutter/material.dart';

import 'compatible/compatible_smart_dialog.dart';
import 'config/smart_config.dart';
import 'config/enum_config.dart';
import 'config/smart_config.dart';
import 'helper/dialog_proxy.dart';
import 'widget/attach_dialog_widget.dart';
import 'widget/dialog_scope.dart';
Expand Down
6 changes: 1 addition & 5 deletions lib/src/util/view_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@ class ViewUtils {
static void addSafeUse(VoidCallback callback) {
var schedulerPhase = schedulerBinding.schedulerPhase;
if (schedulerPhase == SchedulerPhase.persistentCallbacks) {
ViewUtils.addPostFrameCallback((timeStamp) => callback());
widgetsBinding.addPostFrameCallback((timeStamp) => callback());
} else {
callback();
}
}

static void addPostFrameCallback(FrameCallback callback) {
widgetsBinding.addPostFrameCallback(callback);
}
}

WidgetsBinding get widgetsBinding => WidgetsBinding.instance;
Expand Down
21 changes: 21 additions & 0 deletions lib/src/widget/animation/fade_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:flutter/material.dart';

class FadeAnimation extends StatelessWidget {
const FadeAnimation({
Key? key,
required this.controller,
required this.child,
}) : super(key: key);

final AnimationController controller;

final Widget child;

@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: CurvedAnimation(parent: controller, curve: Curves.linear),
child: child,
);
}
}
65 changes: 65 additions & 0 deletions lib/src/widget/animation/highlight_mask_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import 'package:flutter/material.dart';

import '../attach_dialog_widget.dart';

class HighlightMaskAnimation extends StatelessWidget {
const HighlightMaskAnimation({
Key? key,
required this.controller,
required this.maskWidget,
required this.maskColor,
required this.usePenetrate,
required this.targetOffset,
required this.targetSize,
required this.highlightBuilder,
}) : super(key: key);

final AnimationController controller;

final Widget? maskWidget;

final Color maskColor;

final bool usePenetrate;

final Offset targetOffset;
final Size targetSize;

final HighlightBuilder highlightBuilder;

@override
Widget build(BuildContext context) {
//handle mask
late Widget mask;
if (usePenetrate) {
mask = Container();
} else if (maskWidget != null) {
mask = maskWidget!;
} else {
mask = ColorFiltered(
colorFilter: ColorFilter.mode(
// mask color
maskColor,
BlendMode.srcOut,
),
child: Stack(children: [
Container(
decoration: BoxDecoration(
// any color
color: Colors.white,
backgroundBlendMode: BlendMode.dstOut,
),
),

//dissolve mask, highlight location
highlightBuilder(targetOffset, targetSize)
]),
);
}

return FadeTransition(
opacity: CurvedAnimation(parent: controller, curve: Curves.linear),
child: mask,
);
}
}
29 changes: 29 additions & 0 deletions lib/src/widget/animation/mask_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';

class MaskAnimation extends StatelessWidget {
const MaskAnimation({
Key? key,
required this.controller,
required this.maskWidget,
required this.maskColor,
required this.usePenetrate,
}) : super(key: key);

final AnimationController controller;

final Widget? maskWidget;

final Color maskColor;

final bool usePenetrate;

@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: CurvedAnimation(parent: controller, curve: Curves.linear),
child: (maskWidget != null && !usePenetrate)
? maskWidget
: Container(color: usePenetrate ? null : maskColor),
);
}
}
25 changes: 25 additions & 0 deletions lib/src/widget/animation/scale_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';

class ScaleAnimation extends StatelessWidget {
const ScaleAnimation({
Key? key,
required this.controller,
required this.child,
this.alignment,
}) : super(key: key);

final AnimationController controller;

final Widget child;

final Alignment? alignment;

@override
Widget build(BuildContext context) {
return ScaleTransition(
alignment: alignment ?? Alignment(0, 0),
scale: CurvedAnimation(parent: controller, curve: Curves.linear),
child: child,
);
}
}
35 changes: 35 additions & 0 deletions lib/src/widget/animation/size_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'package:flutter/material.dart';

class SizeAnimation extends StatelessWidget {
const SizeAnimation({
Key? key,
required this.controller,
required this.alignment,
required this.child,
}) : super(key: key);

final AnimationController controller;

final AlignmentGeometry alignment;

final Widget child;

@override
Widget build(BuildContext context) {
return SizeTransition(
axis: _handleAxis(),
sizeFactor: controller,
child: child,
);
}

Axis _handleAxis() {
var axis = Axis.vertical;

if (alignment == Alignment.centerLeft ||
alignment == Alignment.centerRight) {
axis = Axis.horizontal;
}
return axis;
}
}
72 changes: 72 additions & 0 deletions lib/src/widget/animation/slide_animation.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'package:flutter/material.dart';

class SlideAnimation extends StatefulWidget {
const SlideAnimation({
Key? key,
required this.alignment,
required this.controller,
required this.child,
}) : super(key: key);

final AlignmentGeometry alignment;

final Widget child;

final AnimationController controller;

@override
State<SlideAnimation> createState() => _SlideAnimationState();
}

class _SlideAnimationState extends State<SlideAnimation>
with TickerProviderStateMixin {
late Tween<Offset> _tween;

@override
void initState() {
_dealContentAnimate();
super.initState();
}

@override
void didUpdateWidget(covariant SlideAnimation oldWidget) {
if (oldWidget.child != widget.child) _dealContentAnimate();
super.didUpdateWidget(oldWidget);
}

@override
Widget build(BuildContext context) {
return SlideTransition(
position: _tween.animate(widget.controller),
child: widget.child,
);
}

///处理下内容widget动画方向
void _dealContentAnimate() {
AlignmentGeometry? alignment = widget.alignment;
var _offset = Offset(0, 0);

if (alignment == Alignment.bottomCenter ||
alignment == Alignment.bottomLeft ||
alignment == Alignment.bottomRight) {
//靠下
_offset = Offset(0, 1);
} else if (alignment == Alignment.topCenter ||
alignment == Alignment.topLeft ||
alignment == Alignment.topRight) {
//靠上
_offset = Offset(0, -1);
} else if (alignment == Alignment.centerLeft) {
//靠左
_offset = Offset(-1, 0);
} else if (alignment == Alignment.centerRight) {
//靠右
_offset = Offset(1, 0);
} else {
//居中使用缩放动画,空结构体,不需要操作
}

_tween = Tween<Offset>(begin: _offset, end: Offset.zero);
}
}
Loading

0 comments on commit a41123b

Please sign in to comment.