如何布局彼此相邻但重叠的小部件
How to layout widgets adjacent to each other, but with overlap
我一直在摆弄 Stack
因为 Column
不允许子窗口小部件重叠。但是,我看到的每个小部件可以彼此相邻布置的示例都需要硬编码宽度和高度。
在我的布局中,子项的高度取决于子项的内容,而在我的 build
函数中是未知的。理想情况下,我想使用 Column
布局我的小部件,并在绿色和蓝色容器上使用负上边距,但这是不允许的。如果我知道每个小部件的渲染高度,绝对定位它们并不困难,但这似乎不可能。
Marc Glasberg 有一个不错的库,名为 assorted_layout_widgets,它有一个 ColumnSuper
小部件,允许重叠列,但它同样适用于所有子项。
对其他人可能有的想法感兴趣。
您可以尝试的一种方法是使用 FractionalTranslation
to move the child by a fraction of its size. Or Transform.translate
将 child 移动一段硬编码的距离。这些不需要 child 具有硬编码大小。
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
FractionalTranslation(
translation: Offset(0, 0.2),
child: Container(
width: 200,
height: 80,
color: Colors.red.withOpacity(1),
),
),
Container(
width: 500,
height: 80,
color: Colors.greenAccent.withOpacity(0.7),
),
Transform.translate(
offset: Offset(0, -10),
child: Container(
width: 500,
height: 80,
color: Colors.deepPurple.withOpacity(0.7),
),
),
],
);
}
}
结果:
编辑:
要让红色框位于绿色框之上,我们可以这样做。
Widget build(BuildContext context) {
return Column(
children: [
FractionalTranslation(
translation: Offset(0, 1),
child: Container(
width: 500,
height: 80,
color: Colors.greenAccent.withOpacity(0.7),
),
),
FractionalTranslation(
translation: Offset(0, -0.8),
child: Container(
width: 200,
height: 80,
color: Colors.red.withOpacity(0.7),
),
),
Transform.translate(
offset: Offset(0, -10),
child: Container(
width: 500,
height: 80,
color: Colors.deepPurple.withOpacity(0.7),
),
),
],
);
}
我一直在摆弄 Stack
因为 Column
不允许子窗口小部件重叠。但是,我看到的每个小部件可以彼此相邻布置的示例都需要硬编码宽度和高度。
在我的布局中,子项的高度取决于子项的内容,而在我的 build
函数中是未知的。理想情况下,我想使用 Column
布局我的小部件,并在绿色和蓝色容器上使用负上边距,但这是不允许的。如果我知道每个小部件的渲染高度,绝对定位它们并不困难,但这似乎不可能。
Marc Glasberg 有一个不错的库,名为 assorted_layout_widgets,它有一个 ColumnSuper
小部件,允许重叠列,但它同样适用于所有子项。
对其他人可能有的想法感兴趣。
您可以尝试的一种方法是使用 FractionalTranslation
to move the child by a fraction of its size. Or Transform.translate
将 child 移动一段硬编码的距离。这些不需要 child 具有硬编码大小。
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
FractionalTranslation(
translation: Offset(0, 0.2),
child: Container(
width: 200,
height: 80,
color: Colors.red.withOpacity(1),
),
),
Container(
width: 500,
height: 80,
color: Colors.greenAccent.withOpacity(0.7),
),
Transform.translate(
offset: Offset(0, -10),
child: Container(
width: 500,
height: 80,
color: Colors.deepPurple.withOpacity(0.7),
),
),
],
);
}
}
结果:
编辑:
要让红色框位于绿色框之上,我们可以这样做。
Widget build(BuildContext context) {
return Column(
children: [
FractionalTranslation(
translation: Offset(0, 1),
child: Container(
width: 500,
height: 80,
color: Colors.greenAccent.withOpacity(0.7),
),
),
FractionalTranslation(
translation: Offset(0, -0.8),
child: Container(
width: 200,
height: 80,
color: Colors.red.withOpacity(0.7),
),
),
Transform.translate(
offset: Offset(0, -10),
child: Container(
width: 500,
height: 80,
color: Colors.deepPurple.withOpacity(0.7),
),
),
],
);
}