flutter - 如何在 Sweep Gradient 中包含 Stroke Cap?

标签 flutter dart flutter-layout

Screenshot

你可以看到我的弧线从顶部开始,但有一些区域被涂成粉红色,应该是白色的。我想是因为我正在使用 StrokeCap.round ,但我如何删除那部分?

画家类:

class MyPainter extends CustomPainter {
  void paint(Canvas canvas, Size size) {
    double centerPoint = size.height / 2;

    Paint paint = Paint()
      ..color = Colors.white
      ..strokeCap = StrokeCap.round
      ..style = PaintingStyle.stroke
      ..strokeWidth = 20;

    paint.shader = SweepGradient(
      colors: [Colors.white, Colors.pink],
      tileMode: TileMode.repeated,
      startAngle: _degreeToRad(270),
      endAngle: _degreeToRad(270 + 360.0),
    ).createShader(Rect.fromCircle(center: Offset(centerPoint, centerPoint), radius: 0));

    double startAngle = _degreeToRad(270);
    double sweepAngle = _degreeToRad(95 / 100 * 360);
    Rect rect = Rect.fromCircle(center: Offset(centerPoint, centerPoint), radius: centerPoint);
    canvas.drawArc(rect, startAngle, sweepAngle, false, paint);
  }

  double _degreeToRad(double degree) => degree * math.pi / 180;

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

用法:
CustomPaint(
  size: Size.fromRadius(100),
  painter: MyPainter(),
)

最佳答案

当您使用 strokeCap = StrokeCap.round 时,它会将一半的笔触宽度添加到您的线条的开头,将一半的笔触宽度添加到结尾以创建线条的圆形边缘,因此在您的计算中,您应该从从头开始一半
我更改了您的代码,它可以正常工作,代码如下:


class MyPainter extends CustomPainter {
  void paint(Canvas canvas, Size size) {
    double centerPoint = size.height / 2;

    double strokeWidth = 30;
    double percentValue=100/100;
    double radius=centerPoint;

    Paint paint = Paint()
      ..color = Colors.white
      ..strokeCap = StrokeCap.round
      ..style = PaintingStyle.stroke
      ..strokeWidth = strokeWidth;

    paint.shader = SweepGradient(
      colors: [Colors.black, Colors.pink],
      tileMode: TileMode.repeated,
      startAngle: _degreeToRad(270),
      endAngle: _degreeToRad(270 + 360.0),
    ).createShader(Rect.fromCircle(center: Offset(centerPoint, centerPoint), radius: 0));


    Rect rect = Rect.fromCircle(center: Offset(centerPoint, centerPoint), radius: radius);

    var scapSize = strokeWidth / 2;
    double scapToDegree = scapSize / radius;

    double startAngle = _degreeToRad(270)+scapToDegree;
    double sweepAngle = _degreeToRad( 360)-(2*scapToDegree);

    canvas.drawArc(rect, startAngle, percentValue*sweepAngle, false, paint);


  }

  double _degreeToRad(double degree) => degree * pi / 180;

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

并为您提供性能提示:

don't create your shader and gradient each time , the Paint method will be executed numers of time so you should check if you already created the shader for the inComing size use that and don't create it again

关于flutter - 如何在 Sweep Gradient 中包含 Stroke Cap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59917009/

相关文章:

Flutter 嵌套的 GestureDetector 不起作用

flutter - 使用 Flutter Provider 就意味着没有 StatefulWidgets?

flutter - 2点和3点抖动

mobile - Flutter 如何使用 ListView 水平和 GridView 垂直滚动屏幕

flutter - 如何从Blogger API在我的flutter应用程序中加载 “image”

dart - 有没有办法检查脚本是否在 dart vm 或 dart2js 中运行?

Flutter:在布局期间对象被赋予无限大小

flutter - 如何为子类属性提供与 Dart 中的父类(super class)不同的类型?

html - 为什么YouTube加载速度如此之快,每次移动进度时,我都会尝试使用flutter代码多次,

ios - mobile-ffmpeg-https (4.3.1) POD 安装失败