【问题标题】:How to have a circle shape like this in flutter?如何在颤动中拥有这样的圆形?
【发布时间】:2019-06-17 07:43:13
【问题描述】:

我试图在我的颤振项目中使用这样的圆形。我尝试在容器中使用边界半径。但它并没有像我预期的那样工作。

那么,我怎样才能有这样一个给定图片的形状?

我尝试过使用这样的容器。

    Container(
            height: 72,
            width: 211,
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.only(
                topRight: Radius.circular(50),
                topLeft: Radius.circular(30))
            ),
          )

【问题讨论】:

  • 你有没有尝试过实现这个目标?
  • 是的,我在容器中尝试了边界半径。但它并没有像我预期的那样工作
  • 也发布您的代码?
  • 你能分享更详细的图像,以便用户可以轻松识别你想要的视图形状吗?
  • 它已更新。请检查@farhana

标签: user-interface flutter dart geometry shapes


【解决方案1】:

您几乎可以使用 CustomPaint 绘制任何东西,看看:

https://api.flutter.dev/flutter/rendering/CustomPainter-class.html

在下面的代码中,我画了类似那个圆圈的东西:

import "package:flutter/material.dart";

void main() {
  runApp(MaterialApp(title: "", home: Home()));
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Container(
            width: double.infinity,
            height: double.infinity,
            child: CustomPaint(
              painter: CirclePainter(),
            )),
      ),
    );
  }
}

class CirclePainter extends CustomPainter {
  final Paint lightBluePaint = Paint()..color = Color(0xFFbde5fa);
  final Paint bluePaint = Paint()..color = Color(0xFF5abef2);
  final TextPainter textPainter = TextPainter(
    textDirection: TextDirection.ltr,
  );

  final TextStyle textStyle = TextStyle(
      color: Colors.white.withAlpha(240),
      fontSize: 18,
      letterSpacing: 1.2,
      fontWeight: FontWeight.w900);

  @override
  void paint(Canvas canvas, Size size) {
    var rect = Rect.fromLTRB(
        -100, size.height - 120, size.width * 0.7, size.height + 250);

    final Path circle = Path()..addOval(rect);
    final Path smallCircle = Path()..addOval(rect.inflate(50));

    canvas.drawPath(smallCircle, lightBluePaint);
    canvas.drawPath(circle, bluePaint);

    drawText(canvas, size, 'Write now');
  }

  void drawText(Canvas canvas, Size size, String text) {
    textPainter.text = TextSpan(style: textStyle, text: text);
    textPainter.layout();
    textPainter.paint(canvas, Offset(50, size.height - 60));
  }

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

【讨论】:

    【解决方案2】:

    要实现图像预览,您需要使用 Stack 类和 Positioned 元素。我做了一个小部件,如图所示。角落里的圆圈可以用带有边界半径的容器制作。

      Container(
        width: MediaQuery.of(context).size.width,
        height: 250,
        margin: EdgeInsets.all(20),
        decoration: BoxDecoration(
          color: Colors.white,
          boxShadow: <BoxShadow>[
            BoxShadow(
              color: Color(0x40000000),
              blurRadius: 5.0,
              spreadRadius: 0.0,
              offset: Offset(0.0, 2.0),
            ),
          ],
        ),
        child: Stack(
          children: <Widget>[
            Container(
              padding: EdgeInsets.all(15.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(
                    'Step 3',
                    style: TextStyle(
                      color: Colors.blue,
                    ),
                  ),
                  SizedBox(height: 5),
                  Text(
                    'It is a long established fact that a reader will be '
                      'distracted by the readable content of a page when '
                      'looking at its layout.',
                    style: TextStyle(
                      color: Colors.black54,
                    ),
                  )
                ],
              ),
            ),
            Positioned(
              top: 150,
              right: MediaQuery.of(context).size.width - 200,
              child: Container(
                width: 200,
                height: 200,
                decoration: BoxDecoration(
                  color: Color(0xFFB5E1F9),
                  borderRadius: BorderRadius.all(
                    Radius.circular(200),
                  ),
                ),
                child: Center(
                  child: Container(
                    width: 150,
                    height: 150,
                    decoration: BoxDecoration(
                      color: Color(0xFF4FB6F0),
                      borderRadius: BorderRadius.all(
                        Radius.circular(150),
                      ),
                    ),
                  ),
                ),
              ),
            ),
            Positioned(
              bottom: 30,
              left: 30,
              child: Text(
                'Write now',
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            ),
          ],
        ),
      );
    

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 2018-08-21
      • 2021-01-05
      • 2021-09-19
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多