【问题标题】:Flutter draw a semicircle (half circle) but without space at the bottomFlutter 画一个半圆(半圆)但底部没有空格
【发布时间】:2021-11-03 07:17:36
【问题描述】:

我尝试使用自定义油漆创建一个半圆形。问题是它总是从中心绘制。这会在底部区域创建一个我不想要的空间。怎么剪?

我已经检查过了,但这里没有回答这个问题: Flutter how to draw semicircle (half circle)

class myPainter extends CustomPainter {

@override
void paint(Canvas canvas, Size size) {
    var centerX = size.width / 2;
    var centerY = size.height / 2;
    var center = Offset(centerX, centerY);
    var radius = min(centerX, centerY);

   canvas.drawArc(Rect.fromCircle(center: center, radius: radius -25),
      doubleToAngle(-90), doubleToAngle(180), false, redCircle);

 bool shouldRepaint(bmiPainter oldDelegate) {
    //return true;
    return oldDelegate._angle != _angle;
  }

@override
  double doubleToAngle(double angle) => angle * pi / 180.0;

}

我像这样嵌入自定义画家:

Flexible(
        flex: 2,
        fit: FlexFit.tight,
        child: Container(

              child: Transform.rotate(
                angle: -pi / 2,
                child: CustomPaint(
                  size: Size(300, 150),
                  key: backgroundKey,
                  painter: myPainter(),
                  child: Container(),
                ),
              ),
            ),
),

这与灵活无关。如果我拿一个容器把它变小,半圆也会变小。 我玩过 Size ,但它并没有改变任何东西。 Size 到底是什么

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Rect.fromCirclecenter 参数,你可以传递sizebottomCenter 值。

    这是一个工作示例:

    自定义画家

    class MyPainter extends CustomPainter {
      @override
      void paint(Canvas canvas, Size size) {
        final redCircle = Paint()
          ..color = Colors.red
          ..style = PaintingStyle.stroke;
        final arcRect = Rect.fromCircle(
            center: size.bottomCenter(Offset.zero), radius: size.shortestSide);
        canvas.drawArc(arcRect, 0, -pi, false, redCircle);
      }
    
      @override
      bool shouldRepaint(MyPainter oldDelegate) => false;
    }
    

    (有界使用)

    Padding(
      padding: EdgeInsets.all(16),
      child: CustomPaint(
        painter: MyPainter(),
        child: SizedBox(width: 128, height: 64),
      ),
    ),
    

    (无限使用)

    Flexible(
      child: Padding(
        padding: EdgeInsets.all(16),
        child: CustomPaint(
          painter: MyPainter(),
          child: AspectRatio(
            aspectRatio: 2,
            child: SizedBox(),
          ),
        ),
      ),
    ),
    

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2018-10-03
      相关资源
      最近更新 更多