|
|
|||||
[+4 06.05.14]
|
Декодер, подсветка текста
Привет всем! Задача следующая :
рассматриваем стандартный декодер текста ( печатающая машинка ) без рандома, тоесть просто добавление по 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, но никогда с ним не работал, и возможно он тут и не причем будет. Жду ваших советов
__________________
Марк Tween |
|
|||||
Можно каждый символ скопировать в 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; } } } }
__________________
Гоночка |
|
|||||
>> как бороться с \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(); } } |
Часовой пояс GMT +4, время: 11:01. |
|
« Предыдущая тема | Следующая тема » |
|
|