我正在尝试扩展ShapeBorder类以添加一些功能.但只是玩涂料方法,我找到了一些我没想到的东西:
边框的角落和矩形的角落似乎不匹配.我使用了以下代码:
边框的角落和矩形的角落似乎不匹配.我使用了以下代码:
class CustomRoundedRectangleBorder extends ShapeBorder { final double borderWidth; final BorderRadius borderRadius; const CustomRoundedRectangleBorder({ this.borderWidth: 1.0,this.borderRadius: BorderRadius.zero,}) : assert(borderRadius != null); @override EdgeInsetsGeometry get dimensions { return new EdgeInsets.all(borderWidth); } @override ShapeBorder scale(double t) { return new CustomRoundedRectangleBorder( borderWidth: borderWidth * (t),borderRadius: borderRadius * (t),); } @override ShapeBorder lerpFrom(ShapeBorder a,double t) { assert(t != null); if (a is CustomRoundedRectangleBorder) { return new CustomRoundedRectangleBorder( borderWidth: ui.lerpDouble(a.borderWidth,borderWidth,t),borderRadius: BorderRadius.lerp(a.borderRadius,borderRadius,); } return super.lerpFrom(a,t); } @override ShapeBorder lerpTo(ShapeBorder b,double t) { assert(t != null); if (b is CustomRoundedRectangleBorder) { return new CustomRoundedRectangleBorder( borderWidth: ui.lerpDouble(borderWidth,b.borderWidth,borderRadius: BorderRadius.lerp(borderRadius,b.borderRadius,); } return super.lerpTo(b,t); } @override Path getInnerPath(Rect rect,{ TextDirection textDirection }) { return new Path() ..addRRect(borderRadius.resolve(textDirection).toRRect(rect).deflate( borderWidth)); } @override Path getOuterPath(Rect rect,{ TextDirection textDirection }) { return new Path() ..addRRect(borderRadius.resolve(textDirection).toRRect(rect)); } @override void paint(Canvas canvas,Rect rect,{ TextDirection textDirection }) { rect = rect.deflate(borderWidth / 2.0); Paint paint; final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); paint = new Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeWidth = borderWidth; canvas.drawRRect(borderRect,paint); } }
并创建矩形如下:
new Container( height: 100.0,width: 200.0,padding: new EdgeInsets.all(10.0),decoration: new ShapeDecoration( color: Colors.black,shape: new CustomRoundedRectangleBorder( borderRadius: new BorderRadius.all(new Radius.circular(20.0)),borderWidth: 10.0,),// side: new BorderSide(color: Colors.white) ),child: new Center(child: new Text("My Button"),
我觉得Flutter源代码采用了类似的方法,但也许我没有看到任何东西.
编辑
将我的绘画风格更改为PaintingStyle.fill,从而在原始矩形而不是边框上绘制一个矩形,我似乎得到了正确的边框:
void paint(Canvas canvas,{ TextDirection textDirection }) { // rect = rect.deflate(borderWidth / 2.0); Paint paint; final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); paint = new Paint() ..color = Colors.red.withOpacity(0.25) ..style = PaintingStyle.fill ..strokeWidth = borderWidth; canvas.drawRRect(borderRect,paint); }
我仍然对如何做到这一点感到困惑……
解决方法
你应该使用canvas.drawPath而不是drawRect
Paint paint = new Paint() ..color = borderColor ..style = PaintingStyle.stroke ..strokeWidth = borderWidth; canvas.drawPath(getOuterPath(rect),paint);
如果你只是想要一个边框,它就足以使用了
@override Path getInnerPath(Rect rect,{TextDirection textDirection}) { return new Path() ..fillType = PathFillType.evenOdd ..addPath(getOuterPath(rect),Offset.zero); }