如何在Flutter CustomPainter中使用贝塞尔曲线绘制形状

13

我正在尝试使用Flutter自定义绘制库来绘制下面的图片。如何绘制这个形状?

输入图像描述

我的代码和结果

import 'package:flutter/material.dart';

class CurvePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint = new Paint();
    paint.color = Colors.green[800];
    paint.style = PaintingStyle.fill;

    var path = new Path();
    path.lineTo(0, size.height * 0.3);

    path.quadraticBezierTo(size.width * 0.35, size.height * 0.4, size.width * 0.7, size.height * 0.21);
    path.quadraticBezierTo(size.width * 0.6, size.height * 0.19, size.width * 0.9, size.height * 0.15);
    path.quadraticBezierTo(size.width , size.height * 0.05, size.width * 0.6, 0);

    canvas.drawPath(path, paint);
  }

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

输入图像描述

1个回答

33

你选择的贝塞尔曲线不是正确的。


这里我展示了我使用哪些曲线。黄色点是起始点和结束点,黑色点代表控制点。
在代码中,我从左到右(从上到下)使用了arcToPoint而不是conicTo,因为它的效果更好。请注意,arcToPoint也可以绘制圆锥曲线。

解释图

这只是一个草图,即比例完全不对,但至少我可以分享恰当的贝塞尔曲线,以便实现你所需的输出。

@override
void paint(Canvas canvas, Size size) {
  final paint = Paint()
    ..color = Colors.red[800]
    ..style = PaintingStyle.fill;

  final path = new Path()
    ..moveTo(size.width * .6, 0)
    ..quadraticBezierTo(
    size.width * .7,
    size.height * .08,
    size.width * .9,
    size.height * .05,
  )
    ..arcToPoint(
    Offset(
      size.width * .93,
      size.height * .15,
    ),
    radius: Radius.circular(size.height * .05),
    largeArc: true,
  )
    ..cubicTo(
    size.width * .6,
    size.height * .15,
    size.width * .5,
    size.height * .46,
    0,
    size.height * .3,
  )
    ..lineTo(0, 0)
    ..close();

  canvas.drawPath(path, paint);
}

请注意,我更新了语法,使用..级联符号和final关键字来定义变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接