Files
MWClash/lib/widgets/effect.dart
chen08209 6e404ab19c Fix windows some issues
Optimize overwrite handle

Optimize access control page

Optimize some details
2025-12-12 14:33:03 +08:00

141 lines
3.2 KiB
Dart

import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
class EffectGestureDetector extends StatefulWidget {
final Widget child;
final GestureLongPressCallback? onLongPress;
final GestureTapCallback? onTap;
const EffectGestureDetector({
super.key,
required this.child,
this.onLongPress,
this.onTap,
});
@override
State<EffectGestureDetector> createState() => _EffectGestureDetectorState();
}
class _EffectGestureDetectorState extends State<EffectGestureDetector>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
double _scale = 1;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedScale(
scale: _scale,
duration: kThemeAnimationDuration,
curve: Curves.easeOut,
child: GestureDetector(
onLongPress: widget.onLongPress,
onLongPressStart: (_) {
setState(() {
_scale = 0.95;
});
},
onTap: widget.onTap,
onLongPressEnd: (_) {
setState(() {
_scale = 1;
});
},
child: widget.child,
),
);
}
}
class CommonExpandIcon extends StatefulWidget {
final bool expand;
const CommonExpandIcon({super.key, this.expand = false});
@override
State<CommonExpandIcon> createState() => _CommonExpandIconState();
}
class _CommonExpandIconState extends State<CommonExpandIcon>
with SingleTickerProviderStateMixin {
late AnimationController _animationController;
late Animation<double> _iconTurns;
static final Animatable<double> _iconTurnTween = Tween<double>(
begin: 0.0,
end: 0.5,
).chain(CurveTween(curve: Curves.fastOutSlowIn));
@override
void initState() {
super.initState();
_animationController = AnimationController(
duration: const Duration(milliseconds: 200),
vsync: this,
);
_iconTurns = _animationController.drive(_iconTurnTween);
if (widget.expand) {
_animationController.value = pi;
}
}
@override
void didUpdateWidget(covariant CommonExpandIcon oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.expand != widget.expand) {
if (widget.expand) {
_animationController.forward();
} else {
_animationController.reverse();
}
}
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animationController.view,
builder: (_, child) {
return RotationTransition(turns: _iconTurns, child: child!);
},
child: const Icon(Icons.expand_more),
);
}
}
Widget commonProxyDecorator(
Widget child,
int index,
Animation<double> animation,
) {
return AnimatedBuilder(
animation: animation,
builder: (_, Widget? child) {
final double animValue = Curves.easeInOut.transform(animation.value);
final double scale = lerpDouble(1, 1.02, animValue)!;
return Transform.scale(scale: scale, child: child);
},
child: child,
);
}