如何在 Flutter 中创建这种形状?

Posted

技术标签:

【中文标题】如何在 Flutter 中创建这种形状?【英文标题】:How to create this kind of shape in Flutter? 【发布时间】:2021-08-27 15:08:55 【问题描述】:

请谁能帮我在手机屏幕的右上角创建这种形状:

提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用 Stack 小部件,并将 Positioned 小部件作为其子小部件,该小部件带有一个带有圆圈的容器,之后您可以将圆圈推出屏幕,以便只渲染它的一部分

class _MyAppState extends State<MyApp> 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: MyApp._title,
      home: Scaffold(
          body: Column(
        children: [
          CircleCorner(),
        ],
      )),
    );
  


class CircleCorner extends StatelessWidget 
  const CircleCorner(
    Key? key,
  ) : super(key: key);

  @override
  Widget build(BuildContext context) 
    Size size = MediaQuery.of(context).size;
    return SizedBox(
      width: size.width,
      height: 300,
      child: Stack(
        children: [
          Positioned(
            top: -460,
            right: -380,
            child: Container(
               width: 600.0,
               height: 600.0,
              decoration: new BoxDecoration(
                color: Colors.black87,
                shape: BoxShape.circle,
              ),
            ),
          ),
        ],
      ),
    );
  

【讨论】:

您的答案有效,但您可以看到图片不像圆圈。 那是什么?你是指图像内的图标吗?它是它的一部分吗?还是黑色的东西不是圆圈? 我指的是黑色的东西而不是里面的图标 你可以改变容器的位置和大小来实现你想要的形式,如果你不想使用一个推到屏幕外的圆圈你可以使用自定义画家来创建精确的形式,我改变了图像,也许这更像你想要的【参考方案2】:

我建议这样做,当然必须根据您的要求进行一些更改

class Demo extends StatelessWidget 
  const Demo(Key? key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return SafeArea(
      child: Container(
        color: Colors.white,
        child: Stack(
          fit: StackFit.expand,
          children: [
            CustomPaint(
              painter: BackgroundPainter(),
            ),
            const Padding(
              padding: EdgeInsets.only(top: 50, right: 50),
              child: Align(
                alignment: Alignment.topRight,
                child: Icon(Icons.menu, size: 50),
              ),
            ),
          ],
        ),
      ),
    );
  


class Point 
  final double _xAxis;
  final double _yAxis;

  Point(this._xAxis, this._yAxis);


class BackgroundPainter extends CustomPainter 
  final Paint _bluePaint;

  BackgroundPainter()
      : _bluePaint = Paint()
          ..color = Colors.lightBlue.shade300
          ..style = PaintingStyle.fill;

  @override
  void paint(Canvas canvas, Size size) 
    paintBlue(size, canvas);
  

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

  void paintBlue(Size size, Canvas canvas) 
    final path = Path();

    path.moveTo(size.width, 0);
    path.lineTo(size.width * 0.60, 0);

    _addPointsToPath(path, [
      Point(size.width * 0.55, size.height * 0.25),
      Point(size.width, size.height * 0.25),
    ]);

    canvas.drawPath(path, _bluePaint);
  

  void _addPointsToPath(Path path, List<Point> points) 
    for (var i = 0; i < points.length - 2; i++) 
      final xDiff = (points[i]._xAxis + points[i + 1]._xAxis) / 2;
      final yDiff = (points[i]._yAxis + points[i + 1]._yAxis) / 2;
      path.quadraticBezierTo(points[i]._xAxis, points[i]._yAxis, xDiff, yDiff);
    

    final secondLastPoint = points[points.length - 2];
    final lastPoint = points[points.length - 1];
    path.quadraticBezierTo(secondLastPoint._xAxis, secondLastPoint._yAxis,
        lastPoint._xAxis, lastPoint._yAxis);
  

【讨论】:

以上是关于如何在 Flutter 中创建这种形状?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CSS 中创建这种形状(带圆角的四边形)?

如何在 Flutter 中创建三角形 UI

如何在flutter android开发中创建这种布局?

如何在 Flutter for android 中创建这种线性渐变不透明度效果?

如何在android中创建形状三角形

如何在 iOS Swift4 中创建这个圆形?