Неработающий htmlText в Actionscript 3.0 - прикольное отображение из увеличенного отображения с использованием string.substring
Это проблема с 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't like <FONT COLOR="#FCFE12">we</FONT> didn'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'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...</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 ответ
В созданной вами IDE TextField вы можете видеть, что у вас есть TextFormat по умолчанию, который присутствует всякий раз, когда вы меняете текст, который сбрасывает шрифт, цвет, размер и т. Д.
Поэтому для вашего динамического 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);
}
}