Flutter中绘制自定义Widget:特定位置边框实现方案咨询
Flutter 绘制目标Widget的实现思路
核心方法:用CustomPainter自定义绘制
Flutter里画这种自定义形状,直接用CustomPainter最方便,针对你卡壳的(0.6, 0)位置边框,给你具体实现思路:
先把逻辑坐标转成画布实际坐标
你用的(0,0)、(0.6,0)这种是逻辑坐标,但Flutter画布默认左上角是(0,0),y轴往下走。所以先写个小方法转一下:Offset logicToCanvas(double x, double y, Size size) { // 假设你说的逻辑坐标左下角是(0,0),右上角是(1,1) return Offset(x * size.width, size.height - y * size.height); }直接画(0.6, 0)位置的边框段
这部分就是底部边框的左半段,用canvas.drawLine一步搞定:- 先拿到起始和终点的实际坐标:
start = logicToCanvas(0, 0, size),end = logicToCanvas(0.6, 0, size) - 调一个画笔样式:
final borderPaint = Paint() ..color = Colors.black // 改成你要的边框颜色 ..strokeWidth = 2 // 边框粗细 ..strokeCap = StrokeCap.square; // 保证和交叉线衔接得平整 - 最后调用
canvas.drawLine(start, end, borderPaint)就画出这段边框了
- 先拿到起始和终点的实际坐标:
交叉线和边框的衔接
交叉线的起点就是这段边框的终点logicToCanvas(0.6, 0, size),终点是logicToCanvas(1, 1, size),用同样的画笔(或者单独改样式)画就行,strokeCap参数能让衔接处没明显断点。其他边框直接补全
你已经会画(0,0)到(0,1)的左边框、(0,1)到(1,1)的顶部边框,用同样的方式,把逻辑坐标转成实际坐标后调用drawLine就行,所有这些绘制代码都放在CustomPainter的paint方法里。
可选优化:用Path画连贯边框
如果之后要调整形状或者加填充,也可以用Path把边框串起来,比如:
final path = Path(); // 左边框:从(0,0)到(0,1) path.moveTo(logicToCanvas(0, 0, size).dx, logicToCanvas(0, 0, size).dy); path.lineTo(logicToCanvas(0, 1, size).dx, logicToCanvas(0, 1, size).dy); // 顶部边框:从(0,1)到(1,1) path.lineTo(logicToCanvas(1, 1, size).dx, logicToCanvas(1, 1, size).dy); // 最后画底部那段边框 path.moveTo(logicToCanvas(0, 0, size).dx, logicToCanvas(0, 0, size).dy); path.lineTo(logicToCanvas(0.6, 0, size).dx, logicToCanvas(0.6, 0, size).dy);
不过对你现在的需求来说,分开画线条更简单直接。
最后把写好的CustomPainter放到CustomPaint组件里,塞进你的Widget树就OK了。
内容的提问来源于stack exchange,提问作者I'm MasY
相关产品推荐
相关产品推荐

