gpt4 book ai didi

flutter - 如何在 flutter 的盒子周围创建虚线边框?

转载 作者:IT老高 更新时间:2023-10-28 12:39:24 34 4
gpt4 key购买 nike

我正在使用 flutter 在我的应用程序中构建一个盒子布局列表。我想要盒子周围的虚线边框。我已经使用 card 小部件来创建盒子。但是,如何在框周围设置虚线边框?

最佳答案

编辑

我已将它作为一个包添加到 pub .

现在,你需要做的就是

DottedBorder(
color: Colors.black,
gap: 3,
strokeWidth: 1,
child: FlutterLogo(size: 148),
)

工作解决方案 [过时]

Dashed Border Image

喜欢 tomerpacificthis answer 中说, Flutter 目前没有虚线边框的默认实现。

我昨天工作了一段时间,并能够使用 CustomPainter 提出解决方案。希望这对某人有所帮助。

DashedRect 添加到您的容器中,就像这样

class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Container(
height: 400,
width: 300,
color: Colors.black12,
child: DashedRect(color: Colors.red, strokeWidth: 2.0, gap: 3.0,),
),
),
);
}
}

DashedRect.dart

import 'package:flutter/material.dart';
import 'dart:math' as math;

class DashedRect extends StatelessWidget {
final Color color;
final double strokeWidth;
final double gap;

DashedRect(
{this.color = Colors.black, this.strokeWidth = 1.0, this.gap = 5.0});

@override
Widget build(BuildContext context) {
return Container(
child: Padding(
padding: EdgeInsets.all(strokeWidth / 2),
child: CustomPaint(
painter:
DashRectPainter(color: color, strokeWidth: strokeWidth, gap: gap),
),
),
);
}
}

class DashRectPainter extends CustomPainter {
double strokeWidth;
Color color;
double gap;

DashRectPainter(
{this.strokeWidth = 5.0, this.color = Colors.red, this.gap = 5.0});

@override
void paint(Canvas canvas, Size size) {
Paint dashedPaint = Paint()
..color = color
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;

double x = size.width;
double y = size.height;

Path _topPath = getDashedPath(
a: math.Point(0, 0),
b: math.Point(x, 0),
gap: gap,
);

Path _rightPath = getDashedPath(
a: math.Point(x, 0),
b: math.Point(x, y),
gap: gap,
);

Path _bottomPath = getDashedPath(
a: math.Point(0, y),
b: math.Point(x, y),
gap: gap,
);

Path _leftPath = getDashedPath(
a: math.Point(0, 0),
b: math.Point(0.001, y),
gap: gap,
);

canvas.drawPath(_topPath, dashedPaint);
canvas.drawPath(_rightPath, dashedPaint);
canvas.drawPath(_bottomPath, dashedPaint);
canvas.drawPath(_leftPath, dashedPaint);
}

Path getDashedPath({
@required math.Point<double> a,
@required math.Point<double> b,
@required gap,
}) {
Size size = Size(b.x - a.x, b.y - a.y);
Path path = Path();
path.moveTo(a.x, a.y);
bool shouldDraw = true;
math.Point currentPoint = math.Point(a.x, a.y);

num radians = math.atan(size.height / size.width);

num dx = math.cos(radians) * gap < 0
? math.cos(radians) * gap * -1
: math.cos(radians) * gap;

num dy = math.sin(radians) * gap < 0
? math.sin(radians) * gap * -1
: math.sin(radians) * gap;

while (currentPoint.x <= b.x && currentPoint.y <= b.y) {
shouldDraw
? path.lineTo(currentPoint.x, currentPoint.y)
: path.moveTo(currentPoint.x, currentPoint.y);
shouldDraw = !shouldDraw;
currentPoint = math.Point(
currentPoint.x + dx,
currentPoint.y + dy,
);
}
return path;
}

@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}

我不希望这适用于所有用例,并且有很大的定制和改进空间。如果您发现任何错误,请发表评论。

关于flutter - 如何在 flutter 的盒子周围创建虚线边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55373829/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com