Flutter 颤振卡:如何在颤振中创建自定义卡小部件

Flutter 颤振卡:如何在颤振中创建自定义卡小部件,flutter,Flutter,我正在尝试在Flatter中创建一张如下所示的自定义卡: 我如何在颤振中实现这一点 这就是我想要实现的目标: 您可以使用ClipPath自定义小部件剪辑 ClipPath(clipper: _CustomClipper(), child: Container(width: 200.0, height: 100.0, color: Colors.grey,),) (例如,灰色容器) constdouble\u=20.0; 常数双弧半径=8.0; 类_CustomClipper扩展了Custom

我正在尝试在Flatter中创建一张如下所示的自定义卡:

我如何在颤振中实现这一点

这就是我想要实现的目标:


您可以使用
ClipPath
自定义小部件剪辑

ClipPath(clipper: _CustomClipper(), child: Container(width: 200.0, height: 100.0, color: Colors.grey,),)
(例如,灰色容器)

constdouble\u=20.0;
常数双弧半径=8.0;
类_CustomClipper扩展了CustomClipper{
@凌驾
路径getClip(大小){
双点=尺寸。宽度/3*2;
最终路径=路径()
…移动到(0.0,_)
…线到(点,_)
…直线至(点,_弧半径)
..直线至(点+弧半径,0.0)
..lineTo(尺寸.宽度-_弧半径,0.0)
..lineTo(尺寸、宽度、弧半径)
…lineTo(尺寸、宽度、尺寸、高度)
..lineTo(0.0,尺寸高度)
…lineTo(0.0,_)
…添加椭圆形(从LTRB开始的矩形)(
点,0.0,点+2*(弧半径,2*(弧半径))
…添加椭圆形(从LTRB开始的矩形)(
尺寸宽度-2*_弧半径,0.0,尺寸宽度,2*_弧半径);
path.close();
返回路径;
}
@凌驾
bool shouldReclip(CustomClipper oldClipper)=>false;
}
UPD-提升解决方案

Material(
    color: Colors.yellow,
    clipBehavior: Clip.antiAlias,
    shape: _CustomBorder(),
    elevation: 16.0, child: Container(width: 200.0, height: 100.0, child: Stack(
        children: <Widget>[
            Positioned(child: FittedBox(fit: BoxFit.scaleDown, child: Text('and a text here too'),),left: 140.0, right: 4.0, top: 4.0,),
            Positioned(child: Text('I want a text here', style: TextStyle(fontSize: 24.0),), top: 40.0, left: 4.0,)
        ],
    ),),)
...
class _CustomBorder extends BorderDirectional {
  @override
  Path getOuterPath(ui.Rect rect, {ui.TextDirection textDirection}) {
    Size size = rect.size;
    double point = size.width / 3 * 2;
    final path = Path()
      ..moveTo(0.0, _topPadding)
      ..lineTo(point, _topPadding)
      ..lineTo(point, _arcRadius)
      ..lineTo(point + _arcRadius, 0.0)
      ..lineTo(size.width - _arcRadius, 0.0)
      ..lineTo(size.width, _arcRadius)
      ..lineTo(size.width, size.height)
      ..lineTo(0.0, size.height)
      ..lineTo(0.0, _topPadding)
      ..addOval(Rect.fromLTRB(
          point, 0.0, point + 2 * _arcRadius, 2 * _arcRadius))
      ..addOval(Rect.fromLTRB(
          size.width - 2 * _arcRadius, 0.0, size.width, 2 * _arcRadius));

    path.close();
    return path;
  }
}
材料(
颜色:颜色,黄色,
clipBehavior:Clip.antiAlias,
形状:_CustomBorder(),
标高:16.0,子项:容器(宽度:200.0,高度:100.0,子项:堆栈(
儿童:[
定位(子项:FittedBox(fit:BoxFit.scaleDown,子项:Text('此处也有一个文本'),),左:140.0,右:4.0,顶:4.0,),
定位(子项:文本(“我想在这里输入文本”,样式:TextStyle(fontSize:24.0)),顶部:40.0,左侧:4.0,)
],
),),)
...
类_CustomBorder扩展了BorderDirective{
@凌驾
路径getOuterPath(ui.Rect Rect,{ui.TextDirection TextDirection}){
大小=rect.Size;
双点=尺寸。宽度/3*2;
最终路径=路径()
…移动到(0.0,_)
…线到(点,_)
…直线至(点,_弧半径)
..直线至(点+弧半径,0.0)
..lineTo(尺寸.宽度-_弧半径,0.0)
..lineTo(尺寸、宽度、弧半径)
…lineTo(尺寸、宽度、尺寸、高度)
..lineTo(0.0,尺寸高度)
…lineTo(0.0,_)
…添加椭圆形(从LTRB开始的矩形)(
点,0.0,点+2*(弧半径,2*(弧半径))
…添加椭圆形(从LTRB开始的矩形)(
尺寸宽度-2*_弧半径,0.0,尺寸宽度,2*_弧半径);
path.close();
返回路径;
}
}

到目前为止您尝试了什么?是否可以像普通卡提升一样向其添加提升?抱歉,如果我打扰了您,但最后是否可以向新卡的主体和提升区域添加文本或其他小部件?我不明白您的问题<代码>材料有它的
子项
-您可以放置其他东西,而不是
容器
。或者你可以把你的小部件放在这个
容器中
我已经更新了图片,所以你会更好地理解我的问题,就像我说的-你可以把任何小部件放在容器中。好的,我已经更新了答案-现在它准确地显示了图片中的内容
Material(
    color: Colors.yellow,
    clipBehavior: Clip.antiAlias,
    shape: _CustomBorder(),
    elevation: 16.0, child: Container(width: 200.0, height: 100.0, child: Stack(
        children: <Widget>[
            Positioned(child: FittedBox(fit: BoxFit.scaleDown, child: Text('and a text here too'),),left: 140.0, right: 4.0, top: 4.0,),
            Positioned(child: Text('I want a text here', style: TextStyle(fontSize: 24.0),), top: 40.0, left: 4.0,)
        ],
    ),),)
...
class _CustomBorder extends BorderDirectional {
  @override
  Path getOuterPath(ui.Rect rect, {ui.TextDirection textDirection}) {
    Size size = rect.size;
    double point = size.width / 3 * 2;
    final path = Path()
      ..moveTo(0.0, _topPadding)
      ..lineTo(point, _topPadding)
      ..lineTo(point, _arcRadius)
      ..lineTo(point + _arcRadius, 0.0)
      ..lineTo(size.width - _arcRadius, 0.0)
      ..lineTo(size.width, _arcRadius)
      ..lineTo(size.width, size.height)
      ..lineTo(0.0, size.height)
      ..lineTo(0.0, _topPadding)
      ..addOval(Rect.fromLTRB(
          point, 0.0, point + 2 * _arcRadius, 2 * _arcRadius))
      ..addOval(Rect.fromLTRB(
          size.width - 2 * _arcRadius, 0.0, size.width, 2 * _arcRadius));

    path.close();
    return path;
  }
}