PDA

Просмотр полной версии : textFormat - печатная машинка


in4core
19.06.2012, 19:50
Бьюсь вот пару дней с одной казалось бы простой задачей.
Есть задача сделать эффект *печатная машинка* для текста + с перебором символов для каждой буквы. Понятное дело, что эффект простейший, и делается минут 10.
Но есть загвоздка для html текста.

В метод запуска эффекта мы передаем текстовое поле и текст который будем печатать, текст у нас будет например такой <font color="#FF0000">hello</font><font color="#FF00FF"> world</font>.

Собственно как делается эффект понятно, строка режется на символы index,index+1 и добавляется в текстовое + уже набранное значение.
Если мы говорим так tf.htmlText = remain + newLetter , то символы от html просто режутся , тоесть
<fo рассматриваться как текст не будет, но будут проходить в памяти, что будет тормозить эффект в местах перехода.

Единственный вариант который я вижу, нужно сделать как то так
// до начала эффекта
tf.htmlText = str;
format = tf.getTextFormat();
// во время эффекта
tf.setTextFormat(format, index - 1 , index )
Проблема в том, что хтмл теги никак не убрать и формат действовать не будет.

Есть ли какие нибудь решения данного вопроса, без таких конструкций

effect.open([ [word , color ] , [ word, color] ... ])
? Хочется привязаться к текст формату, думаю там есть развязка

Alex Lexcuk
19.06.2012, 20:29
Подобная тема
http://www.flasher.ru/forum/showthread.php?t=174291
А с перебором символов

package
{
import flash.display.*;
import flash.text.*;
import flash.events.*;
import flash.ui.*;
import flash.utils.*;


public class Main extends Sprite
{
private var srcTF:TextField = new TextField();
private var resTF:TextField = new TextField();
private var timer:Timer = new Timer(100);

private var abcd:String = 'qwertyuiopasdfghjklzxcvbnm';

public function Main():void
{
srcTF.multiline = true;
srcTF.htmlText = "<b>bold</b> <i><font color='#FF0000' size='16'>red</font></i><br>next line<br><b>bold</b> <i><font color='#FF0000' size='16'>red</font></i><br>next line<br>";
srcTF.autoSize = TextFieldAutoSize.LEFT;

resTF.multiline = true;
resTF.autoSize = TextFieldAutoSize.LEFT;
resTF.y = 100;
addChild(srcTF);
addChild(resTF);


timer.addEventListener(TimerEvent.TIMER, timer_timer);
timer.start();

}

private function timer_timer(e:TimerEvent):void
{

resTF.text = randomString(srcTF.text.substr(0, resTF.text.length + 1));

for (var i:int = 0; i < resTF.text.length; i++)
resTF.setTextFormat(srcTF.getTextFormat(i, i + 1), i, i + 1);

if (srcTF.length == resTF.length) {
timer.stop();
resTF.text = srcTF.text.substr(0, resTF.text.length + 1);
for (var i:int = 0; i < resTF.text.length; i++)
resTF.setTextFormat(srcTF.getTextFormat(i, i + 1), i, i + 1);
}
}

private function randomString(s:String):String {
var i:int;
var rs:String = '';
for (i = 0; i < s.length; i++) {
if (abcd.indexOf(s.charAt(i)) != -1) rs += abcd.charAt(int(Math.random() * abcd.length)) else rs += s.charAt(i);
}
return rs;
}

}

}