Files
MWClash/lib/widgets/fade_box.dart
chen08209 6f8a9039b6 Add rule override
Optimize more details
2025-04-05 21:56:53 +08:00

178 lines
3.7 KiB
Dart

import 'package:animations/animations.dart';
import 'package:fl_clash/common/common.dart';
import 'package:flutter/material.dart';
class FadeBox extends StatelessWidget {
final Widget child;
const FadeBox({
super.key,
required this.child,
});
@override
Widget build(BuildContext context) {
return PageTransitionSwitcher(
transitionBuilder: (
child,
animation,
secondaryAnimation,
) {
return Container(
alignment: Alignment.centerLeft,
child: FadeTransition(
opacity: animation,
child: child,
),
);
},
child: child,
);
}
}
class FadeThroughBox extends StatelessWidget {
final Widget child;
const FadeThroughBox({
super.key,
required this.child,
});
@override
Widget build(BuildContext context) {
return PageTransitionSwitcher(
transitionBuilder: (
child,
animation,
secondaryAnimation,
) {
return Container(
alignment: Alignment.centerLeft,
child: FadeThroughTransition(
animation: animation,
fillColor: Colors.transparent,
secondaryAnimation: secondaryAnimation,
child: child,
),
);
},
child: child,
);
}
}
class FadeScaleBox extends StatelessWidget {
final Widget child;
const FadeScaleBox({
super.key,
required this.child,
});
@override
Widget build(BuildContext context) {
return AnimatedSwitcher(
transitionBuilder: (
child,
animation,
) {
return Container(
alignment: Alignment.bottomRight,
child: FadeScaleTransition(
animation: animation,
child: child,
),
);
},
duration: Duration(milliseconds: 300),
child: child,
);
}
}
class FadeScaleEnterBox extends StatefulWidget {
final Widget child;
const FadeScaleEnterBox({
super.key,
required this.child,
});
@override
State<FadeScaleEnterBox> createState() => _FadeScaleEnterBoxState();
}
class _FadeScaleEnterBoxState extends State<FadeScaleEnterBox>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: commonDuration,
);
_animation = Tween<double>(
begin: 0,
end: 1,
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
));
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller.view,
builder: (_, child) {
return FadeScaleEnterTransition(
animation: _animation,
child: child!,
);
},
child: widget.child,
);
}
}
class FadeScaleEnterTransition extends StatelessWidget {
const FadeScaleEnterTransition({
super.key,
required this.animation,
this.child,
});
final Animation<double> animation;
final Widget? child;
static final Animatable<double> _fadeInTransition = CurveTween(
curve: const Interval(0.0, 0.3),
);
static final Animatable<double> _scaleInTransition = Tween<double>(
begin: 0.70,
end: 1.00,
).chain(CurveTween(curve: Easing.legacyDecelerate));
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: _fadeInTransition.animate(animation),
child: ScaleTransition(
scale: _scaleInTransition.animate(animation),
child: child,
),
);
}
}