Add linux deb dependencies Add backup recovery strategy select Support custom text scaling Optimize the display of different text scale Optimize windows setup experience Optimize startTun performance Optimize android tv experience Optimize default option Optimize computed text size Optimize hyperOS freeform window Add developer mode Update core Optimize more details
185 lines
3.9 KiB
Dart
185 lines
3.9 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;
|
|
final Alignment? alignment;
|
|
|
|
const FadeBox({
|
|
super.key,
|
|
required this.child,
|
|
this.alignment,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return PageTransitionSwitcher(
|
|
transitionBuilder: (
|
|
child,
|
|
animation,
|
|
secondaryAnimation,
|
|
) {
|
|
return Container(
|
|
alignment: alignment ?? Alignment.centerLeft,
|
|
child: FadeTransition(
|
|
opacity: animation,
|
|
child: child,
|
|
),
|
|
);
|
|
},
|
|
child: child,
|
|
);
|
|
}
|
|
}
|
|
|
|
class FadeThroughBox extends StatelessWidget {
|
|
final Widget child;
|
|
final Alignment? alignment;
|
|
final EdgeInsets? margin;
|
|
|
|
const FadeThroughBox({
|
|
super.key,
|
|
required this.child,
|
|
this.alignment,
|
|
this.margin
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return PageTransitionSwitcher(
|
|
transitionBuilder: (
|
|
child,
|
|
animation,
|
|
secondaryAnimation,
|
|
) {
|
|
return Container(
|
|
margin: margin,
|
|
alignment: 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,
|
|
),
|
|
);
|
|
}
|
|
}
|