dart - flutter 自定义画家

标签 dart flutter flutter-layout flutter-animation

您好,我创建了一个扩展 CustomPainter 的小部件。问题是当调用paint方法时,Size参数宽度和高度字段总是0,0我不知道如何解决这个问题。任何想法将不胜感激。这是小部件。谢谢!!

class Box extends CustomPainter {
  double _top = 0.0;
  double _left = 0.0;
  double _width = 0.0;
  double _height = 0.0;
  String _text;

  Box(this._top, this._left, this._width, this._height, this._text);

  @override
  void paint(Canvas canvas, Size size) {
   canvas.drawRect(
      new Rect.fromLTWH(_left, _top, _width, _height),
      new Paint()
        ..style = PaintingStyle.stroke
        ..strokeWidth = 2.0
        ..color = Colors.blue // new Color(0xFF0099FF),
  );
}

 @override
 bool shouldRepaint(Box oldDelegate) {
  return false;
 }
}

并这样使用它:

new Positioned(
      left: 0.0,
      top: 0.0,
      child: new Container(
          child:new CustomPaint(
          painter: new Box(block.boundingBox.top.toDouble(), block.boundingBox.left.toDouble(),
              block.boundingBox.width.toDouble(), block.boundingBox.height.toDouble(),
              block.text)
      ))
  )

再次感谢您提出的任何想法!

最佳答案

更多代码会有所帮助,但我想我可以对您在此处所做的事情给出充分的解释。

我假设您的 Positioned 位于堆栈中,并且由于堆栈中的另一个元素(或由于放置在为其提供大小的小部件中)而导致堆栈具有大小。例如,如果堆栈位于 SizedBox、Container(指定大小)或类似中,它将具有大小。而如果它在一个中心,它会根据它的 child 来调整自己的大小。

在堆栈由其子级确定大小的情况下,它根据最大的 非定位 子级来确定堆栈的大小,即那些未包装在 中的子级已定位 或包含在 Positioned 中但定位未定义左、右、上、右、宽度或高度中的任何一个。

回到你的问题 - 如果我们假设堆栈有大小,那么你的小部件被放置在左上角。但是,正如您所写的那样,您的 Positioned 下的任何小部件都没有实际指定它们自己的大小 - 您还没有为 Container 或 CustomPaint 设置大小。

所以你需要做的实际上是指定你希望你的 CustomPaint 有多大。如果您知道特定的宽度/高度,则可以在 Container 或 CustomPaint 的大小中指定。如果您不想将其拉伸(stretch)到堆栈的大小,则可以简单地删除 Positioned 小部件,或同时定义左/右和/或上/下。或者,您可以将指定的高度或宽度 + 与您想要的尺寸的偏移量组合起来。最后一件事是,即使外部的小部件尺寸正确,CustomPaint 仍可能决定将自己的大小设置为零。如果是这种情况,您需要传入一个大小(我可以肯定,如果您传入 Size.infinite,它将扩展以填充其父级)。

最后一件事是我不确定您在使用 CustomPainter 做什么,但它似乎可能是错误的。如果您所做的只是尝试绘制一个正方形,请使用传递给画家的大小而不是参数(我猜您正在尝试这样做以解决您看到的大小为零的问题)。

例如,如果您想简单地绘制一个填充整个绘画区域的矩形,请使用:

canvas.drawRect(Offset.zero & size, Paint().....);

但是,如果您传入一些东西,则需要确保您没有超出自定义绘制器的范围。来自 CustomPaint 文档:

The painters are expected to paint within a rectangle starting at the origin and encompassing a region of the given size. (If the painters paint outside those bounds, there might be insufficient memory allocated to rasterize the painting commands and the resulting behavior is undefined.)

关于dart - flutter 自定义画家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880005/

相关文章:

flutter - 为什么Android在iOS上不能在TextField中显示正确格式的文本?

flutter - 如何为我的下拉菜单添加自定义选项?

user-interface - 使 SliverAppBar 将图像作为背景而不是颜色

flutter - 如何从本地文件的目录中导入Dart文件?

flutter - 尝试向底部导航栏添加索引时,“The method '> ' was called on null.”

flutter - 布局: Text overflowing in Flutter

dart - ExpansionPanelList 既不展开也不折叠 ExpansionPanel

flutter - StreamBuilder snapshot.hasError 在键盘显示/隐藏 flutter 时显示多次

flutter - 如何在没有脚手架的情况下显示 snackBar

javascript - 在 Flutter Webview 中运行一些 Javascript