Динамическое положение Y TextField через итерации цикла

У меня есть функция с именем 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, которая вызывается во время каждой итерации внутреннего цикла for в dataLoaded.

Все это работает хорошо, за исключением того, что строка _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);
}

person adaam    schedule 26.04.2013    source источник
comment
вы не показываете, как _itemPosition устанавливается/обновляется   -  person BadFeelingAboutThis    schedule 26.04.2013
comment
Вы просто хотите, чтобы все ваши Item были выровнены вертикально в последовательности?   -  person BadFeelingAboutThis    schedule 26.04.2013
comment
@LondonDrugs_MediaServices Да, но мне кажется, что структура моих функций будет препятствовать любым простым решениям   -  person adaam    schedule 26.04.2013


Ответы (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. Предположим также, что каждый элемент имеет height из 10:

Цикл 1:

  • Высота контейнера равна 0 (поскольку в нем сейчас нет элементов). Таким образом, y элемента 1 равно 0

  • после container.addChild(item1) высота контейнера становится 10 (высота элемента 1)

    Цикл 2:

  • y для item2 установлено значение container.height, которое в настоящее время равно 10.

  • после container.addChild(item2) высота контейнера становится 20

    Цикл 3:

  • y для item3 установлено значение 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 в качестве аргумента конструктора

person BadFeelingAboutThis    schedule 26.04.2013
comment
Первоначально я адаптировал это руководство для списка прокрутки: active.tutsplus.com/tutorials/actionscript/ _container содержит все элементы вместе, я не понимаю, как его можно использовать для размещения элементов друг под другом? - person adaam; 27.04.2013
comment
Если все ваши объекты являются дочерними элементами одного и того же контейнера, то на самом деле это довольно просто! Я обновлю свой ответ, чтобы объяснить, как это работает - person BadFeelingAboutThis; 27.04.2013
comment
Да, все они дети _container. Связь между всеми элементами списка прокрутки: _container › _item › _itemTextField - person adaam; 27.04.2013
comment
Большое спасибо, это очень хорошо объясняет вещи. сейчас буду реализовывать - person adaam; 27.04.2013
comment
Хм, мне очень жаль, но я не смог заставить ваше решение работать. Я попытался установить значение textField.y как _container.height, но между элементами остались огромные пробелы. Вам будет проще понять, что происходит, если я просто свяжу вас с zip-архивом моего проекта на моем веб-сайте. Я откатил изменения, которые я сделал до публикации вопроса, чтобы вы могли получить представление о состоянии дел (wherelionsroam.co.uk/resources/SupaCook.zip) - person adaam; 27.04.2013
comment
Вероятно, это сработает, если вы установите для свойства .autoSize вашего текстового поля значение "left". В противном случае текстовое поле будет больше, чем фактический текст, который он содержит, что, вероятно, приведет к разрыву. - person BadFeelingAboutThis; 29.04.2013
comment
Спасибо, похоже, дело пошло. - person adaam; 29.04.2013