更新分享

This commit is contained in:
wyf
2025-04-28 15:37:58 +08:00
parent 850c34b408
commit eae7a2284d
116 changed files with 12143 additions and 3017 deletions

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
class CustomCard extends StatefulWidget {
final double borderRadius; // 圆角
@@ -15,7 +16,7 @@ class CustomCard extends StatefulWidget {
required this.colors,
required this.child,
this.enableAnimation = true, // 默认启用动画效果
this.enableGradient = true, // 默认启用渐变效果
this.enableGradient = true, // 默认启用渐变效果
}) : super(key: key);
@override
@@ -25,36 +26,19 @@ class CustomCard extends StatefulWidget {
class _CustomCardState extends State<CustomCard>
with SingleTickerProviderStateMixin {
double _scale = 1.0;
final Duration _animationDuration = Duration(milliseconds: 50);
final GlobalKey _inkKey = GlobalKey();
final Duration _animationDuration = const Duration(milliseconds: 50);
Future<void> _handleTap(TapDownDetails details) async {
setState(() {
_scale = 0.95;
});
Future<void> _handleTap() async {
if (widget.enableAnimation) {
setState(() {
_scale = 0.95;
});
await Future.delayed(_animationDuration);
await Future.delayed(_animationDuration);
setState(() {
_scale = 1.0;
});
await Future.delayed(_animationDuration);
// 手动触发水波纹
final RenderBox? box =
_inkKey.currentContext?.findRenderObject() as RenderBox?;
if (box != null) {
final Offset localPosition = box.globalToLocal(details.globalPosition);
InkRipple.splashFactory.create(
controller: Material.of(_inkKey.currentContext!)!,
referenceBox: box,
position: localPosition,
color: widget.colors.first.withOpacity(0.2),
containedInkWell: true,
borderRadius: BorderRadius.circular(widget.borderRadius),
textDirection: Directionality.of(context),
);
setState(() {
_scale = 1.0;
});
}
widget.onTap();
@@ -62,51 +46,44 @@ class _CustomCardState extends State<CustomCard>
@override
Widget build(BuildContext context) {
final bool isGradient = widget.enableGradient && widget.colors.length > 1; // 只有启用渐变时,才使用渐变
final bool isGradient = widget.enableGradient && widget.colors.length > 1;
final Color baseColor = widget.colors.first;
return Material(
color: Colors.transparent,
borderRadius: BorderRadius.circular(widget.borderRadius),
child: GestureDetector(
onTapDown: _handleTap,
behavior: HitTestBehavior.translucent, // 关键:让空白区域也能点击
child: widget.enableAnimation // 判断是否启用动画
child: InkWell(
onTap: _handleTap,
borderRadius: BorderRadius.circular(widget.borderRadius),
splashColor: widget.colors.first.withOpacity(0.2),
child: widget.enableAnimation
? AnimatedScale(
scale: _scale,
duration: _animationDuration,
curve: Curves.easeInOut,
child: Ink(
key: _inkKey,
decoration: BoxDecoration(
color: isGradient ? null : baseColor,
gradient: isGradient
? LinearGradient(
colors: widget.colors,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
)
: null,
borderRadius: BorderRadius.circular(widget.borderRadius),
),
child: widget.child,
),
child: _buildContent(isGradient, baseColor),
)
: Ink(
key: _inkKey,
decoration: BoxDecoration(
color: isGradient ? null : baseColor,
gradient: isGradient
? LinearGradient(
colors: widget.colors,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
)
: null,
borderRadius: BorderRadius.circular(widget.borderRadius),
),
child: widget.child,
),
: _buildContent(isGradient, baseColor),
),
);
}
Widget _buildContent(bool isGradient, Color baseColor) {
return Container(
decoration: BoxDecoration(
color: isGradient ? null : baseColor,
gradient: isGradient
? LinearGradient(
colors: widget.colors,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
)
: null,
borderRadius: BorderRadius.circular(widget.borderRadius),
),
child: Padding(
padding: EdgeInsets.fromLTRB(0.rpx, 0.rpx, 0.rpx, 5.rpx),
child: widget.child,
),
);
}