[英]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.