簡體   English   中英

顫振自定義畫家

[英]Flutter Custom Painter

你好,我創建了一個擴展 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(指定了大小)或類似對象中,則它將具有大小。 而如果它在一個中心,它會根據它的孩子來調整自己的大小。

在堆棧由其子項確定大小的情況下,它根據最大的非定位子項來確定它的大小,即那些未包含在Positioned或包含在Positioned但定位沒有的子項' t 定義左、右、上、右、寬度或高度中的任何一個。

所以回到你的問題 - 如果我們假設堆棧有一個大小,那么你的小部件被放置在左上角。 但是,正如所寫的,您的Positioned下的所有小部件實際上都沒有指定它們自己的大小 - 您還沒有為 Container 或 CustomPaint 設置大小。

因此,您需要做的實際上是指定您希望 CustomPaint 有多大。 如果您知道特定的寬度/高度,則可以在 Container 或 CustomPaint 的大小中指定。 如果您不想而是希望它拉伸到堆棧的大小,您可以簡單地刪除定位小部件,或者定義左/右和/或頂部/底部。 或者您可以組合指定的高度或寬度 + 與您想要的尺寸的偏移量。 最后一件事是,即使外面的小部件大小正確,CustomPaint 仍可能決定將自身大小設置為零。 如果是這種情況,您需要傳入一個大小(我確信如果傳入Size.infinite它將擴展以填充其父級)。

最后一件事是我不確定你在用你的 CustomPainter 做什么,但它似乎可能是錯誤的。 如果您所做的只是嘗試繪制一個正方形,請使用傳遞給畫家的大小而不是參數(我猜您正在嘗試這樣做來解決您所看到的大小為零的問題) )。

例如,如果您想簡單地繪制一個填充整個繪畫區域的矩形,請使用以下命令:

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

但是,如果您傳遞內容,則需要確保您的繪圖沒有超出自定義畫家的范圍。 來自 CustomPaint 文檔:

畫家應該在從原點開始並包含給定大小區域的矩形內繪畫。 (如果畫家在這些邊界之外繪畫,則可能沒有足夠的內存分配用於光柵化繪畫命令,並且結果行為未定義。)

CustomPaint小部件的默認大小為Size.zero 要提供您喜歡的尺寸,請使用:

CustomPaint(
size: Size(100,100),
painter: MyPainter(),
),

要根據您的設備提供畫布寬度和高度,您可以使用

double deviceWidth = MediaQuery.of(context).size.width;
double deviceHeight = MediaQuery.of(context).size.height;

在您的構建方法中初始化 deviceWidth 和 deviceHeight 並將其傳遞給CustomPaint小部件的 size 屬性。

CustomPaint(
size: Size(deviceWidth,deviceHeight),
painter: MyPainter(),
),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM