flutter - 容器的自定义形状
问题描述
想法是通过给它 ShapeDecoration() 来制作一个自定义形状的容器。我用这个线程作为参考。
Eventialy 我实现了我想要的形状,但是一旦我用 margin\padding\SizedBoxes 包裹这个自定义形状的容器 - 它的内容就会被推出容器的边界。查看屏幕截图。
但元素之间有填充。
所以问题是我定制的容器行为者一旦有任何边距\填充,它就真的很奇怪。
return Padding(
padding: const EdgeInsets.symmetric(vertical: 40),
child: Container(
padding: const EdgeInsets.all(8),
height: 88,
alignment: Alignment.center,
decoration: ShapeDecoration(
shape: UnitListItemBorderShape(
color: _isCurrent ? theme.listItemBorderColor : theme.listItemBackgroundColor,
),
color: theme.listItemBackgroundColor,
),
child: Stack(
children: [
//custom container's ineer content
] ,
),
);
UnitListItemBorderShape 类:
class UnitListItemBorderShape extends ShapeBorder {
const UnitListItemBorderShape({color}) : _color = color;
final Color _color;
@override
EdgeInsetsGeometry get dimensions => const EdgeInsets.all(0);
@override
Path getInnerPath(Rect rect, {TextDirection textDirection}) => null;
@override
Path getOuterPath(Rect rect, {TextDirection textDirection}) => UnitListItemShape.getShape(
rect.width,
rect.height,
const Radius.circular(16),
const Radius.circular(20),
);
@override
void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {
final Paint borderPaint = Paint()
..color = _color
..style = PaintingStyle.stroke
..strokeWidth = 2;
canvas.drawPath(getOuterPath(rect), borderPaint);
}
@override
ShapeBorder scale(double t) => null;
}
UnitListItemShape 类:
class UnitListItemShape {
static Path getShape(double width, double height, Radius borderRadius, Radius circleRadius) {
final double rightOffset = circleRadius.x;
final Rect rect = Rect.fromCenter(center: Offset(width - rightOffset - 4, height / 2), width: 48, height: 48);
return Path()
..moveTo(borderRadius.x, 0)
..lineTo(width - borderRadius.x - rightOffset, 0)
..arcToPoint(Offset(width - rightOffset, borderRadius.x), radius: borderRadius)
..lineTo(width - rightOffset, (height / 2) - rightOffset - 4)
// ..addRect(rect)
..arcTo(rect, -70 * math.pi / 180, 150 * math.pi / 180, false)
..lineTo(width - rightOffset, height - borderRadius.x)
..arcToPoint(Offset(width - borderRadius.x - rightOffset, height), radius: borderRadius)
..lineTo(borderRadius.x, height)
..arcToPoint(Offset(0, height - borderRadius.x), radius: borderRadius)
..lineTo(0, borderRadius.x)
..arcToPoint(Offset(borderRadius.x, 0), radius: borderRadius)
..fillType = PathFillType.evenOdd
..close();
}
}
解决方案
推荐阅读
- c# - 在 .NET 中将数据库数据与文件系统数据相结合的位置
- c - 用 c 中的两个数组对 n 的所有值进行插值的最佳方法是什么?
- python-3.x - 如何为散景中的动画实现开始停止按钮/播放恢复按钮?
- javascript - 如何使用 Lambda 函数将 nodemailer 连接到 Vue.js 和 Netlify 应用程序
- javascript - 我的模态相互重叠,当两者被点击时,它会触发相同的内容
- advanced-rest-client - 将 http 请求正文参数作为数组发送 - 无效数组
- java - Servlet 过滤器没有被间歇性命中
- python-3.x - 如何将 OpenCV 3.4.2 更新到 OpenCV 4 或最新的稳定版本?
- javascript - Azure Wep 应用程序和函数凭据不起作用
- android - 是否可以使用 gson 中的注释设置默认值?