Flutter Curve Bar

后端 未结 1 1600
感动是毒
感动是毒 2021-01-24 18:38

I wonder if there is a better solution for making a curved bar like the following image.

Here is my flutter code:

import \'package:flutter_web/m         


        
1条回答
  •  一向
    一向 (楼主)
    2021-01-24 19:16

    make a custom ShapeBorder class like this one (the key method is _getPath that returns your shape's Path):

    class CustomShapeBorder extends ShapeBorder {
      const CustomShapeBorder();
    
      @override
      Path getInnerPath(Rect rect, {TextDirection textDirection}) => _getPath(rect);
    
      @override
      Path getOuterPath(Rect rect, {TextDirection textDirection}) => _getPath(rect);
    
      _getPath(Rect rect) {
        final r = rect.height / 2;
        final radius = Radius.circular(r);
        final offset = Rect.fromCircle(center: Offset.zero, radius: r);
        return Path()
          ..moveTo(rect.topLeft.dx, rect.topLeft.dy)
          ..relativeArcToPoint(offset.bottomRight, clockwise: false, radius: radius)
          ..lineTo(rect.center.dx - r, rect.center.dy)
          ..relativeArcToPoint(offset.bottomRight, clockwise: true, radius: radius)
          ..relativeArcToPoint(offset.topRight, clockwise: true, radius: radius)
          ..lineTo(rect.centerRight.dx - r, rect.centerRight.dy)
          ..relativeArcToPoint(offset.topRight, clockwise: false, radius: radius)
          ..addRect(rect);
      }
    
      @override
      EdgeInsetsGeometry get dimensions {
        return EdgeInsets.all(0);
      }
    
      @override
      ShapeBorder scale(double t) {
        return CustomShapeBorder();
      }
    
      @override
      void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {
      }
    }
    

    now you can use it like:

        Container(
          margin: EdgeInsets.only(top: 80),
          height: 50,
          width: double.infinity,
          decoration: ShapeDecoration(
            shape: CustomShapeBorder(),
            //color: Colors.orange,
            gradient:
                LinearGradient(colors: [Colors.blue, Colors.orange]),
            shadows: [
              BoxShadow(
                  color: Colors.black, offset: Offset(3, -3), blurRadius: 3),
            ],
          ),
        ),
    

    Result:

    0 讨论(0)
提交回复
热议问题