我有一个名为dataLoaded
的函数,它通过一个充满成分项的嵌套数组有多个循环。目的是将数组中的每个项插入到TextField中,该TextField构成滚动列表的一部分。我的数组结构如下:
public var so:SharedObject = SharedObject.getLocal("mySharedObject");
public var meat_items_array:Array = new Array(so.data.meat1, so.data.meat2, so.data.meat3);
public var carb_items_array:Array = new Array(so.data.carbs1, so.data.carbs2, so.data.carbs3);
public var other_items_array:Array = new Array(so.data.other1, so.data.other2, so.data.other3);
public var mealtype_items_array:Array = new Array(so.data.mealtype1, so.data.mealtype2, so.data.mealtype3);
public var cuisine_items_array:Array = new Array(so.data.cuisine1, so.data.cuisine2, so.data.cuisine3);
public var veg_items_array:Array = new Array(so.data.veg1, so.data.veg2, so.data.veg3);
public var master_array:Array = new Array(meat_items_array, carb_items_array, other_items_array, mealtype_items_array, cuisine_items_array, veg_items_array);
这是我的dataLoaded
功能:
private function dataLoaded():void
{
for ( var masterCounter:int = 0; masterCounter < master_array.length; masterCounter++ )
{
for (var nestedCounter:int=0;nestedCounter<master_array[masterCounter].length;nestedCounter++)
{
var txt:String = master_array[masterCounter][nestedCounter];
if (txt==null) continue;
populateItem(txt,nestedCounter);
}
}
}
最初,下面滚动列表中所有项目的美学定位都是在dataLoaded
函数内完成的,但我现在决定将所有这些内容移动到一个名为populateItems
的新函数中,该函数被调用在for
中内部dataLoaded
循环的每次迭代期间。
这一切都运作良好,除了行_item.y = nestedCount * _itemPosition;
不再正常工作的事实(原始项目将按顺序放置在列表中,y
值通过乘以a来计算常量(_itemPosition
)乘以内部for
循环的每次迭代的计数器值。现在,3个项目一次输入到列表中,并且在循环的下一次迭代中,另外3个项目被放置在前3个项目的顶部,模糊它们。
如何通过_itemPosition
函数的迭代更改以下函数,以使dataLoaded
更具动态性?
function populateItem(txt:String, nestedCount:Number):void {
_item = new Item();
_item.item_btn_over.alpha = 0;
_itemTextField = new TextField();
_itemTextField.x = _textFieldXPosition;
_itemTextField.y = _textFieldYPosition
_itemTextField.text = txt;
//adds textfield to displaylist//
_item.addChild(_itemTextField);
//vertical positioning//
_item.y = nestedCount * _itemPosition; // ????
//adds items to container displaylist//
_container.addChild(_item);
}
答案 0 :(得分:1)
我并不完全清楚你要做什么,但假设这段代码只运行一次,这应该做你想要的:
_item.y = _container.height + padding; //this will always put the next item at the bottom of the container after the previous one (padding can be any number you want)
这是如何工作的,假设您有3个对象,您在循环中依次添加到container
,并且您为每个项目赋予container.height
的y值。我们还假设每个项目的height
为10:
循环1:
容器高度为0
(因为目前没有商品)
因此,item1的y
为0
在container.addChild(item1)
容器之后
高度变为10(item1的高度)
循环2:
item2的y
设置为container.height,目前为10
container.addChild(item2)
容器高度变为20 之后
循环3:
item3的y
设置为container.height,目前为20
container.addChild(item3)
容器高度变为30 之后
如果您的代码多次运行(因此_container
已经包含对象),那么只要您需要重新排列,就可以运行这样的函数:
function orderItem():void {
var padding:int = 5; //5 pixel gap between items
var tmpY:Number = 0;
var tmpItem:DisplayObject;
for(var i:int=0;i<_container.numChildren;i++){
tmpItem = _container.getChildAt(i);
tmpItem.y = tmpY;
tmpY += tmpItem.height + padding;
}
}
这会遍历_container
的每个孩子并垂直堆叠项目。
顺便说一下,采取这一切会更加清晰:
_item.item_btn_over.alpha = 0;
_itemTextField = new TextField();
_itemTextField.x = _textFieldXPosition;
_itemTextField.y = _textFieldYPosition
_itemTextField.text = txt;
//adds textfield to displaylist//
_item.addChild(_itemTextField);
并将其放在Item
的构造函数中,然后传入txt
作为构造函数参数