【问题标题】:How to make a custom button shape in flutter如何在颤动中制作自定义按钮形状
【发布时间】:2021-02-08 13:18:12
【问题描述】:

我正在做一个项目,我想实现一个按钮

我怎样才能轻松做出这个形状。

【问题讨论】:

    标签: flutter user-interface dart flutter-animation


    【解决方案1】:

    您可以使用CustomPainter。看看this great example如何使用它。

    这是你想要实现的一个小例子(虽然我没有做圆形边框,但你可以轻松扩展:

    import 'package:flutter/material.dart';
    
    main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Drawing Paths',
          home: Scaffold(
            body: Center(
              child: GestureDetector(
                onTap: () => print('Do Something'),
                child: CustomPaint(
                  size: Size(200, 50),
                  painter: CurvePainter(),
                ),
              ),
            ),
          ),
        );
      }
    }
    
    class CurvePainter extends CustomPainter {
      @override
      void paint(Canvas canvas, Size size) {
        var paint = Paint()
          ..color = Color(0xFFE32087)
          ..style = PaintingStyle.fill;
    
        var path = Path()
          ..moveTo(size.width*0.2, 0)
          ..lineTo(size.width, size.height*0.2)
          ..lineTo(size.width, size.height)
          ..lineTo(0, size.height);
    
        canvas.drawPath(path, paint);
      }
    
      @override
      bool shouldRepaint(CustomPainter oldDelegate) {
        return true;
      }
    }
    

    结果

    【讨论】:

      【解决方案2】:

      要么使用代表此按钮的图像并用GestureDetector 包裹它(不推荐,但有时 UI 太复杂以至于纯粹在 Flutter 中制作它可能会过大,所以记住这个选项也不错)或玩CustomClipper!

      您要做的是创建一个ContainerFlatButton 并用ClipPath 包装它,您提供一个CustomClipper 作为clipperClipPath 属性。在CustomClipper 的实现中,您可以按照自己的意愿塑造小部件。查看这篇很棒的 Medium 帖子(不是我写的,感谢 Kinjal Dhamat),她解释了如何使用 CustomClipper 并塑造你想要的一切的各种方式:

      https://medium.com/flutter-community/flutter-custom-clipper-28c6d380fdd6

      根据 pskink 的建议,创建一个自定义的 ShapeBorder 类,例如将其设置为 FlatButtonshape 属性,有相当多的好处,但需要一些额外的知识,看看这个帖子:

      Flutter - ClipPath

      【讨论】:

      • FlatButton 具有 shape 属性 - 无需自定义剪辑
      • 据我所知,如果你想使用FlatButtonshape 属性,你必须提供一个ShapeBorder 实例,因为这是一个自定义形状,你必须扩展 ShapeBorder 并自己实现功能,ShapeBorder 有很多功能要实现 - 采用 CustomClipper / CustomPainter 方式似乎更容易
      • 在这两种情况下,您都需要Path - 从getOuterPath 返回 - 仅此而已
      • 是的,在这两种情况下我们都需要Path,但正如我之前写的,您仍然需要在ShapeBorder 中实现其他功能,例如,它们比CustomClipper 中的功能要多得多。但最后两者都工作得很好:)
      • “您仍然需要在 ShapeBorder 中实现其他功能,这些功能比在 CustomClipper 中要多得多。” - 我不知道您使用的是什么 IDE,但两者都是 android studio并且 vs 代码只需单击鼠标即可完成 - shape 属性由于某种原因存在于每个按钮中 - 如果你想要一个圆形按钮,你真的会添加 CustomClipper 小部件还是简单地添加 shape: CircleBorder()shape 属性也支持形状变形 - 尝试例如 CircleBorder 并在调用 setState 后将其更改为 RoundedRectangleBorder,您将看到“神奇”的形状变形
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2016-08-20
      • 2015-12-24
      • 2019-11-17
      • 2018-08-08
      • 2016-07-27
      相关资源
      最近更新 更多