You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter自定义圆形进度条:如何实现带3D阴影的复刻效果

Flutter圆形进度条3D立体感优化求助

我正在开发一个Flutter项目,需要复刻下图的圆形进度条:
目标进度条

我尝试使用CustomPainter实现,目前效果已相似,但缺少使目标进度条呈现3D立体感的阴影,整体偏扁平。以下是我的现有代码:

class GradientCirclePainter extends CustomPainter {
  final double progress;

  GradientCirclePainter({required this.progress});

  @override
  void paint(Canvas canvas, Size size) {

    final double innerRadius = size.width / 2 - 21;
    final double innerShadowRadius = size.width / 2 - 30;
    final double outerRadius = size.width / 2;

    final Rect rect = Rect.fromCircle(center: size.center(Offset.zero), radius: outerRadius);
    const double startAngle = -0.5 * pi;
    final double sweepAngle = 2 * pi * progress;

    final Paint trackPaint = Paint()
      ..strokeWidth = 20.0
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round
      ..color = const Color.fromARGB(255, 229, 234, 236);
      
    final Paint progressPaint = Paint()
      ..strokeWidth = 20.0
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round
      ..shader = const LinearGradient(
        colors: [Color(0xFFC2B18A), Color(0xFFA3906B)],
      ).createShader(Rect.fromCircle(center: size.center(Offset.zero), radius: size.width / 2));

    final Paint innerCirclePaint = Paint()
      ..strokeWidth = 20.0
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round
      ..color = const Color(0xFFF8F8FB);
      
    final Paint innerShadowPaint = Paint()
        ..shader = RadialGradient(
          center: Alignment.center,
          colors: [const Color(0xFFE4F3FB).withOpacity(0.2), Colors.transparent],
          stops: const [0.45, 1.0],
      ).createShader(Rect.fromCircle(center: size.center(Offset.zero), radius: outerRadius))
      ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 5.0,);

    canvas.drawCircle(size.center(Offset.zero), innerShadowRadius, innerShadowPaint);
    canvas.drawCircle(size.center(Offset.zero), outerRadius, trackPaint);
    canvas.drawCircle(size.center(Offset.zero), innerRadius, innerCirclePaint);
    canvas.drawArc(rect, startAngle, sweepAngle, false, progressPaint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

class GradientCircle extends StatelessWidget {
  final double progress;

  const GradientCircle({super.key, required this.progress});

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: GradientCirclePainter(progress: progress),
      size: const Size(double.infinity, double.infinity), // Adjust the size as needed
    );
  }
}

当前实现效果如图:
当前进度条效果

希望得到帮助或提示,让进度条更接近目标样式,非常感谢!

内容的提问来源于stack exchange,提问作者gioravered

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:45:13