TextField的动态Y位置通过循环的迭代

时间:2013-04-26 16:26:34

标签: actionscript-3 flash-cs6

我有一个名为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);
}

1 个答案:

答案 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的y0

  • 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作为构造函数参数