PDA

Просмотр полной версии : Декодер, подсветка текста


in4core
22.01.2012, 01:51
Привет всем! Задача следующая :
рассматриваем стандартный декодер текста ( печатающая машинка ) без рандома, тоесть просто добавление по 1 букве через интервал в текстовое поле. Но вот проблема, как бороться с \n и html тегами , а именно font-color.
В голову пришла такая идея. Заменяем \n например на charAt(0), через split.join , после чего добавляя по одной букве и в проверке натыкаясь на символ (0) добавляем ( или заменяем ) newline. С цветом немного сложнее, но смысл тот же, нам совершенно не нужна закрывающая тега </font> , нам достаточно перехватить только открывающуюся и посчитать кол-во символов. Думаю как то так :

str.split('someWord').join(charAt(1) + 'someWord');

//...

if( symbols[index] == charAt(1) ) tempStr = '<font color =...>';
//
showStr = tempStr + symbols[index];
if(symbols[index] == ' ') field.htmlText = showStr + '</font>';
Но мне кажется, что это супер велосипедный-велосипед, и наверняка есть лучше реализации!
Есть мнение, что можно покопать в сторону TLFTextfield, но никогда с ним не работал, и возможно он тут и не причем будет.

Жду ваших советов

Alex Lexcuk
22.01.2012, 03:53
Можно каждый символ скопировать в bitmapData

package
{
import flash.display.*;import flash.events.*;import flash.geom.*;import flash.ui.*;import flash.text.*;
/**
* ...
* @author Lexcuk
*/
public class DocHtmlWriter extends Sprite
{
private var txt:TextField;
private var bmdArr:Vector.<Bitmap>;
private var frCount:int;
public function DocHtmlWriter()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
addChild(txt = new TextField());
txt.border = txt.multiline = txt.wordWrap = true;
txt.width = txt.height = 550;

var colorArr:Vector.<uint> = Vector.<uint>([0xFF0000, 0xFF8000, 0x008080, 0x804000]);
var s:String = 'How is it going? ';
var str:String = '';
var i:int;
for (i = 0; i < 500; i++) {
str += '<font color ="#'+colorArr[i%colorArr.length].toString(16)+'" size="'+(30-i%s.length)+'">'+s.charAt(i % s.length)+'</font>';
if ((i+1) % s.length == 0 && Math.random()>0.7) str += '\n';
}

txt.htmlText = str;

bmdArr = new Vector.<Bitmap>();
for (i = 0; i < txt.length;i++){
var r:Rectangle = txt.getCharBoundaries(i);
if (r == null) continue;
var bmd:BitmapData = new BitmapData( r.width, r.height,true,0x00000000);
var bm:Bitmap;
var m:Matrix = new Matrix();
m.tx = -r.x;
m.ty = -r.y;
bmd.draw(txt,m,null,null,null);
bmdArr.push(bm = new Bitmap(bmd));
bm.x = r.x;
bm.y = r.y;
}
txt.text = '';
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

private function enterFrameHandler(e:Event):void {
addChild(bmdArr[frCount]);
frCount++;
if (frCount >= bmdArr.length) {
while (numChildren > 0) removeChildAt(0);
frCount = 0;
}
}

}

}

http://www.murmadillo.tut.su/m/DocHtmlWriter.swf

in4core
22.01.2012, 04:06
Оифгенное решение. спасибо!!!

silin
22.01.2012, 13:16
>> как бороться с \n и html тегами
можно и не бороться, а взять все getTextFormat-ом
в textField.text хранится обычный текст с соответствующим html-ной разметке форматом
public class Main extends Sprite
{
private var srcTF:TextField = new TextField();
private var resTF:TextField = new TextField();
private var timer:Timer = new Timer(100);


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

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


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

}

private function timer_timer(e:TimerEvent):void
{

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);

if (srcTF.text.length == resTF.text.length)
timer.stop();

}

}

in4core
22.01.2012, 17:53
Силин благодарю, тоже интересное решение