2011-03-18 78 views
0

我想在集裝箱動態添加的組件如帆布(TileList中限制每個孩子都有相同的大小,GridList是表現不佳),例如動態添加組件

<mx:Canvas id="myHolder" width="600" height="550"> 

</mx:Canvas> 
<mx:Button label="Add Button" click="addButton()"/> 

當我按一下按鈕,我希望添加一個組件(無論組件是什麼,也可能每個組件都有不同的大小),如果所有添加的子項的總寬度大於myHolder,我希望新的子項可以以新線開始,並且將高度myHolder (自定義代碼佈局更好)

+0

HBox不以這種方式工作。它是水平的盒子(顧名思義)並將兒童包裝在一行中。開始新行的事情被稱爲TileList(適用於一種項目)。如果您的項目不同,請查看GridLayout,甚至在Canvas上使用自定義代碼進行佈局。 – alxx 2011-03-18 07:27:08

+0

確切地說,我想顯示的項目有不同的大小,畫布很好,但是如何用自定義代碼來佈局它們。 – jason 2011-03-22 06:18:49

回答

1

在畫布上,你有完全的自由奠定使用他們xy性質的任何地方的部件,所以有許多方法來剝皮這隻貓。由於您需要行,其中一種方法可能是(未測試):

//inside of your Canvas-based component 
private function updateChildrenPositions():void 
{ 
    var rowY:Number = 0; 
    var rowWidth:Number = 0; 
    var rowHeight:Number = 0; 
    for (var i:int = 0, total:int = numChildren; i < total; i++) 
    { 
     var child:DisplayObject = getChildAt(i); 
     if (rowWidth + child.width > width) 
     { 
      //child will cause overflow, start next row 
      rowY += rowHeight; 
      rowWidth = 0; 
      rowHeight = 0; 
     } 
     rowWidth += child.width; 
     child.x = rowWidth; 
     child.y = rowY; 
     if (child.height > rowHeight) rowHeight = child.height; //accumulating max height 
    } 
    height = rowY + rowHeight; 
} 

這假設Canvas根據佈局具有固定的寬度和設置的高度。您可以稍後添加填充物和間隙,這是一個很好的練習:)

+0

感謝您的答案。它運行得很好,但有時候每行的最後一個孩子會被截斷(set horizo​​ntalScrollPolicy =「off」) – jason 2011-03-24 08:18:43

1

要獲得所需的功能,我不會使用HBox。正如alxx建議的那樣,TileList會更適合這種情況。

下面是一些例子使用TileList讓你開始:

http://blog.flexexamples.com/category/halo/tilelist/

http://learn.adobe.com/wiki/display/Flex/TileList

+0

但是TileList的每個孩子都有相同的寬度和高度,如果每個孩子的尺寸不同 – jason 2011-03-22 06:15:47

+0

@jason,我們正在談論多大或多小?尺寸差異是否相當大? – 2011-03-22 15:07:17

+0

我的組件由一個標籤組件和一個圖標組件組成,但標籤的文本不同,有些可能很長,有些可能較短,那麼如何處理呢?你有什麼主意嗎? – jason 2011-03-23 01:19:13