Сломанный htmlText в ActionScript 3.0 - фанки-отображение из увеличенного отображения с использованием string.substring

Это проблема textField.htmlText в ActionScript 3.0 и класса, который я для него создаю.

Пытаясь не публиковать весь мой класс, мне удалось свести проблему к тому, что кажется глупой и почти неразрешимой проблемой. Кажется, что текстовые поля (в частности, созданные с помощью ActionScript) испытывают невыносимые трудности с эффектом ввода текста, созданным с помощью

myTextField.htmlText =  myString.substr(0, length);

где длина - постоянно увеличивающееся приращение. Однако давайте рассмотрим более конкретный пример. Для начала у нас есть случайная строка в кадре 1 нашего файла .fla:

var Text0:String = 'It wasn\'t like we didn\'t have love. John and I shared much of our love, but for some reason something went terribly wrong one day...\nWe talked less, we saw each other less, we hardly even got to know each other anymore. The love was dried up, and if I stayed I would have withered, and choked on words I could never share...';

Используя мой класс, он берет эту строку, и для ключевых слов X применяет теги Y HTML вокруг этих слов:

var textBuildah = new textBuilder(); //Class name, for this example, is textBuilder
Text0 = textBuildah.htmlModify(Text0, ['love', 'red'], ['we', '~#FCFE12']);

Это берет Text0 (здесь мы все еще находимся в действиях кадра 1) и делает с ним следующее:

trace(Text0) // Outputs: It wasn't like <FONT COLOR="#FCFE12">we</FONT> didn't have <FONT COLOR="#FF0000">love</FONT>. John and I shared much of our <FONT COLOR="#FF0000">love</FONT>, but for some reason something <FONT COLOR="#FCFE12">we</FONT>nt terribly wrong one day... We talked less, <FONT COLOR="#FCFE12">we</FONT> saw each other less, <FONT COLOR="#FCFE12">we</FONT> hardly even got to know each other anymore. The <FONT COLOR="#FF0000">love</FONT> was dried up, and if I stayed I would have withered, and choked on words I could never share...

Я предполагаю, что все эти HTML-теги верны. Затем мы делаем это:

textBox.htmlText = Text0 //textBox is a text field that was put on the stage and named "textBox" using the properties window

И он отображается именно так, как я хочу (нижний правый угол этого изображения) [i49.tinypic.com/2upts1v.jpg]. Добавьте http: //, чтобы увидеть это.

Затем я стираю строку кода выше и пробую следующее:

var Length:Number = 0;
textBox.addEventListener(Event.ENTER_FRAME, writeText);

function writeText(e:Event):void {
    if (Length < Text0.length) {
        Length ++;
        e.currentTarget.htmlText = Text0.substring(0, Length);
        trace(e.currentTarget.htmlText+"\n"+e.currentTarget.name+"\n");
    } else {
        e.currentTarget.htmlText = Text0;
        e.currentTarget.removeEventListener(Event.ENTER_FRAME, writeText);
    }
}

И это работает так же, как если бы вы просто выполняли textBox.htmlText = Text0;

Затем мы пробуем что-то новое. Мы создаем текстовое поле с помощью ActionScript и применяем к нему тот же прослушиватель событий:

var LengthTwo:Number = 0;
var myTextField = new TextField();
myTextField.x = 100
myTextField.y = 100;
myTextField.width = 200;
myTextField.height = 150;
myTextField.wordWrap = true;

addChild(myTextField);

mytextField.addEventListener(Event.ENTER_FRAME, writeText);

function writeTextTwo(e:Event):void {
if (LengthTwo < Text0.length) {
    LengthTwo++;
    e.currentTarget.htmlText = Text0.substring(0, Length);
    trace(e.currentTarget.htmlText+"\n"+e.currentTarget.name+"\n");
} else {
    e.currentTarget.htmlText = Text0;
    e.currentTarget.removeEventListener(Event.ENTER_FRAME, writeText);
}
}

Он производит что-то вроде того, что вы видите в центре этого изображения. [i49.tinypic.com/2upts1v.jpg]. Добавьте http: //, чтобы увидеть это. Кроме того, когда он печатает, он часто и дезориентирует меняет цвета. Я сделал несколько трассировок и понял, что htmlText myTextField имеет дополнительные теги в начале. Вот снимок одной из следов:

<P ALIGN="LEFT"><FONT FACE="Times Roman" SIZE="12" COLOR="#FF0000" LETTERSPACING="0" KERNING="0">It wasn&apos;t like <FONT COLOR="#FCFE12">we</FONT> didn&apos;t have love. John and I shared much of our love, but for some reason something <FONT COLOR="#FCFE12">we</FONT>nt terribly wrong one day...</FONT></P><P ALIGN="LEFT"><FONT FACE="Times Roman" SIZE="12" COLOR="#FF0000" LETTERSPACING="0" KERNING="0">We talked less, <FONT COLOR="#FCFE12">we</FONT> saw each other less, <FONT COLOR="#FCFE12">we</FONT> hardly even got to know each other anymore. The love was dried up, and if I stayed I would have withered, and choked on words I could never share..</FONT></P>
instance5

<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Calibri" SIZE="10" COLOR="#FFFFFF" LETTERSPACING="0" KERNING="0">It wasn&apos;t like <FONT COLOR="#FCFE12">we</FONT> didn&apos;t have <FONT COLOR="#FF0000">love</FONT>. John and I shared much of our <FONT COLOR="#FF0000">love</FONT>, but for some reason something <FONT COLOR="#FCFE12">we</FONT>nt terribly wrong one day...</FONT></P></TEXTFORMAT><TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Calibri" SIZE="10" COLOR="#FFFFFF" LETTERSPACING="0" KERNING="0">We talked less, <FONT COLOR="#FCFE12">we</FONT> saw each other less, <FONT COLOR="#FCFE12">we</FONT> hardly even got to know each other anymore. The <FONT COLOR="#FF0000">love</FONT> was dried up, and if I stayed I would have withered, and choked on words I could never share..</FONT></P></TEXTFORMAT>
textBox

Я понял, что на протяжении всего этого процесса текстовое поле, помещенное на сцену и настроенное на рендеринг HTML-тегов, сохранит свои начальные теги.

<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Calibri" SIZE="10" COLOR="#FFFFFF" LETTERSPACING="0" KERNING="0">

Там и просто внесите изменения в указанные штуки внутри. Однако для текстового поля, добавленного VIA Actionscript 3.0, он изменяет любой из вышеперечисленных начальных тегов по мере выполнения функции writeText, и подстрока начинает включать все больше и больше тегов HTML.

Кто-нибудь знает, что мне не хватает? Есть ли свойство, которое мне нужно определить, чтобы избавиться от этого странного эффекта?

Кроме того, если объяснение было слишком длинным, это файл .fla, который производит точно такая же проблема, с которой я столкнулся. Среднее текстовое поле - проблема. TextField в правом нижнем углу не проблема.

Если вы не можете обрабатывать .fla, созданный для CS3 / 4, сделайте следующее:

var Text0:String = 'It wasn\'t like <font color = "#FCFE12">we</font> didn\'t have <font color = "#FF0000">love</font>. John and I shared much of our <font color = "#FF0000">love</font>, but for some reason something <font color = "#FCFE12">we</font>nt terribly wrong one day...\nWe talked less, <font color = "#FCFE12">we</font> saw each other less, <font color = "#FCFE12">we</font> hardly even got to know each other anymore. The <font color = "#FF0000">love</font> was dried up, and if I stayed I would have withered, and choked on words I could never share...';
var myTextField:TextField = new TextField();
var Length:Number = 0;
var LengthTwo:Number = 0;
myTextField.x = 75;
myTextField.y = 100;
myTextField.width = 400;
myTextField.height = 150;
myTextField.wordWrap = true;
myTextField.textColor = 0xFFFFFF;
addChild(myTextField);

textBox.addEventListener(Event.ENTER_FRAME, writeText);
myTextField.addEventListener(Event.ENTER_FRAME, writeTextTwo);

function writeText(e:Event):void {
    if (Length < Text0.length) {
        Length ++;
        e.currentTarget.htmlText = Text0.substring(0, Length);
        trace(e.currentTarget.htmlText+"\n"+e.currentTarget.name+"\n");
    } else {
        e.currentTarget.htmlText = Text0;
        e.currentTarget.removeEventListener(Event.ENTER_FRAME, writeText);
    }
}

function writeTextTwo(e:Event):void {
if (LengthTwo < Text0.length) {
    LengthTwo++;
    e.currentTarget.htmlText = Text0.substring(0, Length);
    trace(e.currentTarget.htmlText+"\n"+e.currentTarget.name+"\n");
} else {
    e.currentTarget.htmlText = Text0;
    e.currentTarget.removeEventListener(Event.ENTER_FRAME, writeText);
}
}

До сих пор я пытался установить TextFormat для myTextField прямо под определением textField. Затем я попытался установить конкретный текстовый формат вне поля. Я пробовал сделать defaultTextFormat новым форматом, пробовал сбросить таблицу стилей с помощью функции writeText ... Для меня это было немного логистическим кошмаром. Я понятия не имею, как остановить странные изменения цвета в .fla ...

Однако проблема возникает не только с цветом. Это происходит с полужирным шрифтом, курсивом и т. Д., Которые вы вводите в функцию и применяете к ней эффект ввода текста. Однако, если вы просто установите htmlText = x, все будет хорошо.

Любые идеи?

РЕДАКТИРОВАТЬ: кажется, есть небольшая проблема с реализацией одних и тех же вещей с использованием полужирного шрифта, курсива, подчеркивания и т.д. и т.д. - ответьте здесь!


person Jyoti    schedule 02.03.2010    source источник


Ответы (1)


Вы можете увидеть в вашей среде IDE созданное TextField, которое вы иметь по умолчанию TextFormat, который присутствует при каждом изменении текст, сбрасывающий шрифт, цвет, размер и т. д.

Итак, для вашего динамического текстового поля as3 создайте новый TextFormat со всем вашим форматом, который вы хотите сохранить, а затем в вашем слушателе событий просто сбросьте свойство defaultTextFormat перед его написанием:

var Text0:String = 'It wasn\'t like <font color = "#FCFE12">we</font> didn\'t have <font color = "#FF0000">love</font>. John and I shared much of our <font color = "#FF0000">love</font>, but for some reason something <font color = "#FCFE12">we</font>nt terribly wrong one day...\nWe talked less, <font color = "#FCFE12">we</font> saw each other less, <font color = "#FCFE12">we</font> hardly even got to know each other anymore. The <font color = "#FF0000">love</font> was dried up, and if I stayed I would have withered, and choked on words I could never share...';
var myTextField:TextField = new TextField();
var Length:Number = 0;
var LengthTwo:Number = 0;
myTextField.x = 75;
myTextField.y = 100;
myTextField.width = 400;
myTextField.height = 150;
myTextField.wordWrap = true;
addChild(myTextField);

// create a TextFormat
var tf:TextFormat = new TextFormat("Calibri", 10, 0xffffff);

myTextField.addEventListener(Event.ENTER_FRAME, writeTextTwo);

function writeTextTwo(e:Event):void {
  if (LengthTwo < Text0.length) {
    LengthTwo++;

    // reset the default TextFomat
    e.currentTarget.defaultTextFormat = tf;

    e.currentTarget.htmlText = Text0.substring(0, Length);
    trace(e.currentTarget.htmlText+"\n"+e.currentTarget.name+"\n");
  } else {
    e.currentTarget.htmlText = Text0;
    e.currentTarget.removeEventListener(Event.ENTER_FRAME, writeText);
  }
}
person Patrick    schedule 02.03.2010
comment
Спасибо, Патрик. Я ценю это. Я делал что-то подобное раньше, за исключением того, что я установил defaultTextFormat в tf, а затем попытался вызвать defaultTextFormat внутри функции события, например: e.currentTarget.setTextFormat (e.currentTarget.defaultTextFormat); Я думал, что это было что-то, что было навсегда высечено на камне после того, как было установлено значение по умолчанию, но теперь я понимаю, что формат по умолчанию управляется Flash Player во время рендеринга стадии. Еще раз спасибо! - person Jyoti; 02.03.2010
comment
О, небольшая заметка. Похоже, что этот метод НЕ работает для тегов ‹i›, ‹b›, ‹u› и т. Д. Я не хочу задавать совершенно новый вопрос, поэтому, если вы знаете, как заставить такие теги работать, я был бы признателен! - person Jyoti; 09.07.2010