我需要在颤振中实现这一点:
我尝试制作 aRow并设置背景来Text处理矩形,然后设置 aClipPath来制作三角形。这样做的问题是边缘不精确(您可以在下图中看到矩形和三角形之间有一条细线),而且尺寸也固定,ClipPath因此如果我想在某个时候更改文本大小,我会必须再次微调三角形。
这是我的代码:
class TriangleClipper extends CustomClipper<Path> {
@override
Path getClip(Size size) {
final path = Path();
path.lineTo(0.0, size.height);
path.lineTo(size.width / 3, size.height);
path.close();
return path;
}
@override
bool shouldReclip(TriangleClipper oldClipper) => false;
}
Row(
children: [
Container(
color: Colors.orange,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text(
"a label",
),
),
),
ClipPath(
clipper: TriangleClipper(),
child: Container(
color: Colors.orange,
height: 23,
width: 20,
),
)
],
)
Run Code Online (Sandbox Code Playgroud)
我虽然double.infinity在 's child 中使用而不是固定大小ClipPath可以解决这个问题,但这样做会使三角形消失(可能它变得太大而我看不到它或位于某些东西后面)。
解决这个问题的正确方法是什么?我想我可以使用 a 绘制梯形ClipPath,但是如何使其宽度适应 a 的长度Text?
实现这一目标的一种方法是这样的。
class TriangleClipper extends CustomClipper<Path> {
@override
Path getClip(Size size) {
final w = size.width;
final h = size.height;
final triangleWidth = 10;
final path = Path();
path.lineTo(0, 0);
path.lineTo(0, h);
path.lineTo(w, h);
path.lineTo(w - triangleWidth, 0);
path.close();
return path;
}
@override
bool shouldReclip(TriangleClipper oldClipper) => false;
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它。
ClipPath(
clipper: TriangleClipper(),
child: Container(
padding: EdgeInsets.fromLTRB(4, 4, 14, 4), // 4 + triangleWidth for right padding
color: Colors.orange,
child: Text('A label'),
),
),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |