自定义颤振小部件形状

ath*_*hor 4 flutter flutter-layout

我正在尝试在 Flutter 中构建以下布局。

我希望实现两件事:

  • 渲染绘制对角线的背景(我是通过 BoxDecoration 猜测的)
  • 沿对角线放置粉色容器夹子项 - 即,如果文本对于一行而言太大,则应换行到新行。

有任何想法吗?

对角线布局形状

小智 5

这是我的代码:

Stack(
  children: <Widget>[
    Pic(),
    Info(),
  ],
)
Run Code Online (Sandbox Code Playgroud)

对于小部件图片:

Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      alignment: Alignment.centerRight,
      fit: BoxFit.fitHeight,
      image: NetworkImage(
          'https://media.sproutsocial.com/uploads/2014/02/Facebook-Campaign-Article-Main-Image2.png'),
    ),
  ),
)
Run Code Online (Sandbox Code Playgroud)

对于小部件信息:

ClipPath(
  clipper: TrapeziumClipper(),
  child: Container(
    color: Colors.white,
    padding: EdgeInsets.all(8.0),
    width: MediaQuery.of(context).size.width * 3/5,
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        ConstrainedBox(
          constraints: BoxConstraints(
            maxWidth: MediaQuery.of(context).size.width * 6/15
          ),
          child: Text(
            'Testing clipping with soft wrap',
            softWrap: true,
            style: Theme.of(context).textTheme.title,
          ),
        ),
      ],
    ),
  ),
)
Run Code Online (Sandbox Code Playgroud)

对于 TrapeziumClipper:

class TrapeziumClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    path.lineTo(size.width * 2/3, 0.0);
    path.lineTo(size.width, size.height);
    path.lineTo(0.0, size.height);
    path.close();
    return path;
  }
  @override
  bool shouldReclip(TrapeziumClipper oldClipper) => false;
}
Run Code Online (Sandbox Code Playgroud)


rmt*_*zie 4

有多种方法可以做到这一点。一种方法是使用 CustomPainter 将其用作背景并让它绘制粉红色+图片。

另一种方法是使用堆栈,如下所示:

container (with pink background)
  -> stack
     -> picture, clipped
     -> text, etc
Run Code Online (Sandbox Code Playgroud)

您可以按照通常的方式布置文本,并将图片向右对齐并定义一个ClipPath,根据您的需要对其进行剪辑。

要使文本换行,请将其放入ConstrainedBoxSizedBox中,并确保将其设置为换行(我相信是 softwrap 属性)。