2011-03-18 79 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