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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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,您将看到“神奇”的形状变形

以上是关于如何在颤动中制作自定义按钮形状的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义形状按钮

如何在颤动中将图标放在自定义按钮内

如何在自定义按钮颤动中给 onPressed 一个方法

如何在颤动中自定义切换按钮[关闭]

如何在颤动中绘制自定义动态高度曲线形状?

颤动:自定义单选按钮