如何在 flutter 中制作自定义按钮形状

How to make a custom button shape in flutter

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

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

要么使用代表此按钮的图像并用 GestureDetector 包裹它(不推荐,但有时 UI 太复杂以至于完全在 Flutter 中制作它可能有点矫枉过正,因此保留此选项in mind is not bad) 或者玩 CustomClipper!

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

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

根据 pskink 的建议,创建自定义 ShapeBorder class,例如,将设置为 FlatButtonshape 属性,具有有很多好处,但需要一些额外的知识,看看这个 post:

您可以使用 CustomPainter. Have a look at 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;
  }
}

结果: