Неработающий htmlText в Actionscript 3.0 - прикольное отображение из увеличенного отображения с использованием string.substring - PullRequest
1 голос
/ 02 марта 2010

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

В попытке не публиковать весь мой класс, мне удалось свести проблему к тому, что кажется глупой и почти невозможной для преодоления проблемой. Кажется, что TextFields (в ​​частности, созданные с помощью 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;

Затем мы попробуем что-то новое. Мы создаем textField с использованием 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, который вызывает точно такую ​​же проблему, как и у меня . Среднее текстовое поле является проблемой. Текстовое поле в правом нижнем углу не является проблемой.

Если вы не можете обработать .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. Затем я попытался установить определенный TextFormat вне поля. Я попытался сделать defaultTextFormat новым форматом, я попытался сбросить таблицу стилей в функции writeText ... Это было для меня небольшим логистическим кошмаром. Я понятия не имею, как остановить странные изменения цвета в .fla ...

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

Есть идеи?

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

1 Ответ

1 голос
/ 02 марта 2010

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

Итак, для вашего динамического as3 TextField создайте новый 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);
  }
}
...