0

我有一个名为的函数dataLoaded,它通过一个充满成分项的嵌套数组进行多个循环。目的是将数组中的每个项目插入到构成滚动列表一部分的 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中,该函数fordataLoaded.

这一切都很好,除了该行_item.y = nestedCount * _itemPosition;不再正常工作(最初项目将按顺序放置在列表中,y通过将常量()乘以_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);
}
4

1 回答 1

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在循环中按顺序添加这些对象,并且您为每个项目赋予 y 值container.height。我们还假设每个项目的 aheight为 10:

循环 1:

  • 容器高度是0(因为里面目前没有项目)所以 item1y0

  • 容器高度变为10后container.addChild(item1)(item1的高度)

    循环 2:

  • item2y设置为 container.height,目前为 10

  • container.addChild(item2)容器高度变为 20后

    循环 3:

  • item3y设置为 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作为构造函数参数传入

于 2013-04-26T17:59:49.613 回答