динамически создавать несколько текстовых полей на основе array.length

Я искал весь день, и мне не повезло найти решение для этого.

Что я хочу сделать, так это динамически создавать TextFields на основе моего array.length. Итак, если у меня есть 3 строки в моем массиве, необходимо создать 3 текстовых поля с текстом массива.

Мне удалось фактически создать TextFields на основе array.length, однако впоследствии я не знаю, как ссылаться на них по отдельности, чтобы, скажем, переместить x, y для массива [1]. Я попытался сохранить текстовые поля в другом массиве с помощью метода .push, но не могу правильно их сослаться.

Какие-либо предложения?

//Create textfields based on data in Array - in this case 3 textfields
var textArray:Array = new Array('First TextField','TextField Two','Anything, really');

//Array to .push "save" created textfields
var referenceArray:Array = new Array();

// Creating font instance
var garageInstance:Font = new garage();

var myFormat:TextFormat = new TextFormat();

//Embedding font
myFormat.font = garageInstance.fontName;
myFormat.color = 0xFFFFFF;
myFormat.size = 46;
myFormat.align = TextFormatAlign.CENTER;

for (var i:int; i < textArray.length; i++)
{
//Creating the textfield object and naming it "myTextField2"
var myTextField2:TextField = new TextField();

myTextField2.defaultTextFormat = myFormat;
myTextField2.width = 930;
myTextField2.embedFonts = true;
myTextField2.multiline = true;
myTextField2.wordWrap = true;
myTextField2.selectable = false;
myTextField2.htmlText = textArray[i];

myTextField2.autoSize = TextFieldAutoSize.CENTER;

//Here we add the new textfield instance to the stage with addchild()
addChild(myTextField2);

//Saving textfield into array   
referenceArray.push(myTextField2);

}

person user1231561    schedule 04.05.2011    source источник


Ответы (2)


Я не видел ничего странного в вашем коде, все просто отлично работает. Если вы не видите никакого результата, возможно, ваш фон установлен на белый или у вас уже есть белый объект, добавленный на сцену. В этом случае вы ничего не увидите, так как цвет вашего текста установлен на белый (0xffffff). Например, если вы установите его черным (0x000000), вы увидите хороший результат.

Если это не так, правильно ли вы указали свой шрифт? При использовании Adobe IDE щелкните правой кнопкой мыши шрифт в библиотеке и выберите «Экспорт для ActionScript».

Ссылка на массив, который вы используете, идеальна. Поместите этот код после вашего скрипта:

trace(referenceArray[0], referenceArray[0].text);

и вы увидите, он отслеживает результат:

[object TextField] First TextField

Таким образом, вывод в порядке, ваш код может видеть экземпляр, поэтому он может прочитать его текстовое свойство, и это правильно.

Если вы хотите динамически установить координаты текстового поля, просто введите

myTextField2.y = i * 50;

в цикле for. Каждое текстовое поле будет размещено следующим образом: 0, 50, 100 и т. д.

Вы также можете поиграть с координатой x.

person anemgyenge    schedule 04.05.2011
comment
Эй anemgyenge, Большое спасибо за ваш ответ. Я мог бы сделать myTextField2.y = i * 50; однако это было бы просто 0, 50, 100 и т. д. Однако допустим, я хочу расположить текст в: referenceArray[0].text x = 0 и referenceArray[1].text = x = 500 и т. д. В реальном setup, я анимирую текстовые поля из начальной, средней и конечной точки, поэтому я хочу иметь возможность ссылаться на каждое текстовое поле индивидуально, чтобы я мог размещать текстовые поля в разных местах. - person user1231561; 04.05.2011
comment
Затем вы можете создать еще один массив, например, position, и ввести каждую позицию текстового поля там и в цикле: textfield[i].x = position[i]. Итак, вы имеете в виду позиционировать все текстовое поле, верно? - person anemgyenge; 04.05.2011
comment
Хм, да, это действительно может звучать как идея. Думаю, мне не удалось рассказать об этом окончательный поворот - и это то, что у меня есть два контейнера, которые я добавляю, добавляя обмен разными текстовыми полями между ними. У меня есть начальный текст на экране - это будет анимация, а второй контейнер анимируется - в то время как container1 сбрасывается в исходное положение по умолчанию, а следующий текст в массиве заменяется на container1. Итак, предположим, что для части подкачки мне нужно иметь возможность как-то напрямую ссылаться на текстовое поле в моей функции слайда - person user1231561; 04.05.2011
comment
В этом случае, я думаю, вы можете принять ответ как ответ :) Если у вас есть еще повороты и вопросы, не вошедшие в заголовок, попробуйте и задайте их в новом вопросе :) - person anemgyenge; 04.05.2011
comment
Вы совершенно правы. Большое спасибо за вклад anemgyenge :) - person user1231561; 04.05.2011

Можно попробовать массив, заполненный объектами, которые определяют свойства каждого текстового поля.

Ваши объекты могут определять любые свойства, которые вам нравятся - встроенные или созданные на заказ (если вы расширите TextField своим собственным классом и добавите его вместо этого).

Пример: массив:

var ar:Array = [
{
    text: "text field 1",
    y: 100,
    x: 20
},
{
    text: "text field 2",
    y: 200,
    x: 10,
    alpha: 0.5 // demonstrating that you can define any properties in the object
}];

И цикл for, который создает ваши поля:

/**
 * Iterate through ar and create textfields with defined properties
 */
var i:Object;
for each(i in ar)
{
    var t:TextField = new TextField();

    /**
     * Text format things here
     */

    var j:String;
    for(j in i)
    {
        t[j] = i[j];
    }

    addChild(t);
}
person Marty    schedule 04.05.2011