68 lines
1.6 KiB
Dart
68 lines
1.6 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
||
|
|
import '../../../shared/theme/theme_extensions.dart';
|
||
|
|
|
||
|
|
class PressableScale extends StatefulWidget {
|
||
|
|
final Widget child;
|
||
|
|
final VoidCallback? onTap;
|
||
|
|
final BorderRadius? borderRadius;
|
||
|
|
|
||
|
|
const PressableScale({
|
||
|
|
super.key,
|
||
|
|
required this.child,
|
||
|
|
this.onTap,
|
||
|
|
this.borderRadius,
|
||
|
|
});
|
||
|
|
|
||
|
|
@override
|
||
|
|
State<PressableScale> createState() => _PressableScaleState();
|
||
|
|
}
|
||
|
|
|
||
|
|
class _PressableScaleState extends State<PressableScale>
|
||
|
|
with SingleTickerProviderStateMixin {
|
||
|
|
late AnimationController _controller;
|
||
|
|
late Animation<double> _scale;
|
||
|
|
|
||
|
|
@override
|
||
|
|
void initState() {
|
||
|
|
super.initState();
|
||
|
|
_controller = AnimationController(
|
||
|
|
vsync: this,
|
||
|
|
duration: AnimationDuration.fast,
|
||
|
|
lowerBound: 0.0,
|
||
|
|
upperBound: 1.0,
|
||
|
|
);
|
||
|
|
_scale = Tween<double>(begin: 1.0, end: 0.98).animate(
|
||
|
|
CurvedAnimation(parent: _controller, curve: AnimationCurves.easeInOut),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
void dispose() {
|
||
|
|
_controller.dispose();
|
||
|
|
super.dispose();
|
||
|
|
}
|
||
|
|
|
||
|
|
void _onTapDown(TapDownDetails _) => _controller.forward();
|
||
|
|
void _onTapUp(TapUpDetails _) => _controller.reverse();
|
||
|
|
void _onTapCancel() => _controller.reverse();
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return GestureDetector(
|
||
|
|
onTapDown: _onTapDown,
|
||
|
|
onTapUp: _onTapUp,
|
||
|
|
onTapCancel: _onTapCancel,
|
||
|
|
onTap: widget.onTap,
|
||
|
|
child: ScaleTransition(
|
||
|
|
scale: _scale,
|
||
|
|
child: ClipRRect(
|
||
|
|
borderRadius:
|
||
|
|
widget.borderRadius ??
|
||
|
|
BorderRadius.circular(AppBorderRadius.card),
|
||
|
|
child: widget.child,
|
||
|
|
),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|