Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Декодер, подсветка текста (http://www.flasher.ru/forum/showthread.php?t=174291)

in4core 22.01.2012 01:51

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

Код AS3:

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
Код AS3:

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-ной разметке форматом
Код AS3:

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

Силин благодарю, тоже интересное решение


Часовой пояс GMT +4, время: 16:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.