diff --git a/lib/common/widgets/animated_dialog.dart b/lib/common/widgets/animated_dialog.dart index b27323b2e..c2823305a 100644 --- a/lib/common/widgets/animated_dialog.dart +++ b/lib/common/widgets/animated_dialog.dart @@ -1,11 +1,16 @@ +import 'package:PiliPalaX/common/widgets/no_splash_factory.dart'; +import 'package:PiliPalaX/common/widgets/overlay_pop.dart'; import 'package:flutter/material.dart'; class AnimatedDialog extends StatefulWidget { - const AnimatedDialog({Key? key, required this.child, this.closeFn}) - : super(key: key); + const AnimatedDialog({ + Key? key, + required this.videoItem, + required this.closeFn, + }) : super(key: key); - final Widget child; - final Function? closeFn; + final dynamic videoItem; + final Function closeFn; @override State createState() => AnimatedDialogState(); @@ -13,44 +18,53 @@ class AnimatedDialog extends StatefulWidget { class AnimatedDialogState extends State with SingleTickerProviderStateMixin { - late AnimationController? controller; - late Animation? opacityAnimation; - late Animation? scaleAnimation; + late AnimationController controller; + late Animation opacityAnimation; + late Animation scaleAnimation; @override void initState() { super.initState(); controller = AnimationController( - vsync: this, duration: const Duration(milliseconds: 800)); - opacityAnimation = Tween(begin: 0.0, end: 0.6).animate( - CurvedAnimation(parent: controller!, curve: Curves.easeOutExpo)); - scaleAnimation = - CurvedAnimation(parent: controller!, curve: Curves.easeOutExpo); - controller!.addListener(() => setState(() {})); - controller!.forward(); + vsync: this, duration: const Duration(milliseconds: 255)); + opacityAnimation = Tween(begin: 0.0, end: 0.6) + .animate(CurvedAnimation(parent: controller, curve: Curves.linear)); + scaleAnimation = CurvedAnimation(parent: controller, curve: Curves.linear); + controller.addListener(() => setState(() {})); + controller.forward(); } @override void dispose() { - controller!.removeListener(() {}); - controller!.dispose(); + controller.removeListener(() {}); + controller.dispose(); super.dispose(); } + void closeFn() async { + await controller.reverse(); + widget.closeFn(); + } + @override Widget build(BuildContext context) { return Material( - color: Colors.black.withOpacity(opacityAnimation!.value), + color: Colors.black.withOpacity(opacityAnimation.value), child: InkWell( + highlightColor: Colors.transparent, splashColor: Colors.transparent, - onTap: () => widget.closeFn!(), + splashFactory: NoSplashFactory(), + onTap: closeFn, child: Center( child: FadeTransition( - opacity: scaleAnimation!, + opacity: scaleAnimation, child: ScaleTransition( - scale: scaleAnimation!, - child: widget.child, + scale: scaleAnimation, + child: OverlayPop( + videoItem: widget.videoItem, + closeFn: closeFn, + ), ), ), ), diff --git a/lib/common/widgets/no_splash_factory.dart b/lib/common/widgets/no_splash_factory.dart new file mode 100644 index 000000000..f8ba95e00 --- /dev/null +++ b/lib/common/widgets/no_splash_factory.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class NoSplashFactory extends InteractiveInkFeatureFactory { + @override + InteractiveInkFeature create( + {required MaterialInkController controller, + required RenderBox referenceBox, + required Offset position, + required Color color, + required TextDirection textDirection, + bool containedInkWell = false, + RectCallback? rectCallback, + BorderRadius? borderRadius, + ShapeBorder? customBorder, + double? radius, + VoidCallback? onRemoved}) { + return _NoInteractiveInkFeature( + controller: controller, + referenceBox: referenceBox, + color: color, + onRemoved: onRemoved); + } +} + +class _NoInteractiveInkFeature extends InteractiveInkFeature { + @override + void paintFeature(Canvas canvas, Matrix4 transform) {} + _NoInteractiveInkFeature({ + required super.controller, + required super.referenceBox, + required super.color, + super.onRemoved, + }); +} diff --git a/lib/common/widgets/overlay_pop.dart b/lib/common/widgets/overlay_pop.dart index 6b9c03e1b..7445b7aa6 100644 --- a/lib/common/widgets/overlay_pop.dart +++ b/lib/common/widgets/overlay_pop.dart @@ -14,12 +14,12 @@ class OverlayPop extends StatelessWidget { @override Widget build(BuildContext context) { - final double imgWidth = min(Get.height,Get.width) - 8 * 2; + final double imgWidth = min(Get.height, Get.width) - 8 * 2; return Container( margin: const EdgeInsets.symmetric(horizontal: 8), width: imgWidth, decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, + color: Theme.of(context).colorScheme.surface, borderRadius: BorderRadius.circular(10.0), ), child: Column( @@ -47,7 +47,7 @@ class OverlayPop extends StatelessWidget { child: IconButton( tooltip: '关闭', style: ButtonStyle( - padding: MaterialStateProperty.all(EdgeInsets.zero), + padding: WidgetStateProperty.all(EdgeInsets.zero), ), onPressed: () => closeFn!(), icon: const Icon( @@ -79,7 +79,7 @@ class OverlayPop extends StatelessWidget { ? videoItem.pic as String : videoItem.cover as String, ); - // closeFn!(); + closeFn!(); }, icon: const Icon(Icons.download, size: 20), ) diff --git a/lib/pages/hot/view.dart b/lib/pages/hot/view.dart index 787f43d44..76a1623a9 100644 --- a/lib/pages/hot/view.dart +++ b/lib/pages/hot/view.dart @@ -5,7 +5,6 @@ import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/constants.dart'; import 'package:PiliPalaX/common/widgets/animated_dialog.dart'; -import 'package:PiliPalaX/common/widgets/overlay_pop.dart'; import 'package:PiliPalaX/common/skeleton/video_card_h.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/common/widgets/video_card_h.dart'; @@ -158,10 +157,7 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { return OverlayEntry( builder: (context) => AnimatedDialog( closeFn: _removePopupDialog, - child: OverlayPop( - videoItem: videoItem, - closeFn: _removePopupDialog, - ), + videoItem: videoItem, ), ); } diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index e67c26a95..e6b3cc2cd 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -8,7 +8,6 @@ import 'package:PiliPalaX/common/constants.dart'; import 'package:PiliPalaX/common/skeleton/video_card_v.dart'; import 'package:PiliPalaX/common/widgets/animated_dialog.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; -import 'package:PiliPalaX/common/widgets/overlay_pop.dart'; import 'package:PiliPalaX/pages/home/index.dart'; import 'package:PiliPalaX/pages/main/index.dart'; @@ -137,10 +136,7 @@ class _LivePageState extends State return OverlayEntry( builder: (context) => AnimatedDialog( closeFn: _removePopupDialog, - child: OverlayPop( - videoItem: liveItem, - closeFn: _removePopupDialog, - ), + videoItem: liveItem, ), ); } diff --git a/lib/pages/rank/zone/view.dart b/lib/pages/rank/zone/view.dart index caef2ddd5..12d56b910 100644 --- a/lib/pages/rank/zone/view.dart +++ b/lib/pages/rank/zone/view.dart @@ -5,7 +5,6 @@ import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/constants.dart'; import 'package:PiliPalaX/common/widgets/animated_dialog.dart'; -import 'package:PiliPalaX/common/widgets/overlay_pop.dart'; import 'package:PiliPalaX/common/skeleton/video_card_h.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/common/widgets/video_card_h.dart'; @@ -162,10 +161,7 @@ class _ZonePageState extends State return OverlayEntry( builder: (context) => AnimatedDialog( closeFn: _removePopupDialog, - child: OverlayPop( - videoItem: videoItem, - closeFn: _removePopupDialog, - ), + videoItem: videoItem, ), ); } diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 61594a4b6..037778c62 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -137,10 +137,7 @@ class _RcmdPageState extends State return OverlayEntry( builder: (context) => AnimatedDialog( closeFn: _removePopupDialog, - child: OverlayPop( - videoItem: videoItem, - closeFn: _removePopupDialog, - ), + videoItem: videoItem, ), ); } diff --git a/lib/pages/video/detail/related/view.dart b/lib/pages/video/detail/related/view.dart index 1aded8c8a..9208ae789 100644 --- a/lib/pages/video/detail/related/view.dart +++ b/lib/pages/video/detail/related/view.dart @@ -3,7 +3,6 @@ import 'package:get/get.dart'; import 'package:PiliPalaX/common/skeleton/video_card_h.dart'; import 'package:PiliPalaX/common/widgets/animated_dialog.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; -import 'package:PiliPalaX/common/widgets/overlay_pop.dart'; import 'package:PiliPalaX/common/widgets/video_card_h.dart'; import '../../../../common/constants.dart'; import '../../../../utils/grid.dart'; @@ -117,10 +116,7 @@ class _RelatedVideoPanelState extends State return OverlayEntry( builder: (BuildContext context) => AnimatedDialog( closeFn: _removePopupDialog, - child: OverlayPop( - videoItem: videoItem, - closeFn: _removePopupDialog, - ), + videoItem: videoItem, ), ); }