Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   flash.text.engine (http://www.flasher.ru/forum/showthread.php?t=117367)

WGR 26.10.2008 07:19

flash.text.engine
 
Вложений: 1
Сегодня взялся опробовать новый метод вывода текста в CS4.
Вот что из этого вышло. Думаю вполне неплохо так как ресайз не даёт тормозов даже с большим текстом. Но все-таки кто что может предложит оптимизировать.
А так есть пару вопросов.
Адобовцы заложили способ выделять такой текст?
И ешё если в текстовую линию помещаю графический элемент который больше её то весь текстовый блок пропадает! То есть это так и задумано и надо предварительно те что не влезут ужимать ?

Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.Timer;
        import flash.text.engine.*;
        import LoaderExample;
 
        public class GroupElementExample extends Sprite {
                var format:ElementFormat;
                var TF:MovieClip=new MovieClip  ;
                var smileName=[":-)","8-)",":-D"];
                var smileNameLink=["0.swf","1.swf","2.swf"];
                var mc_array:Array=new Array  ;
                var loadTimer:Timer=new Timer(500,1);
                var textBlock:TextBlock=new TextBlock  ;
 
                public function GroupElementExample():void {
                        stage.scaleMode=StageScaleMode.NO_SCALE;
                        stage.align=StageAlign.TOP_LEFT;
                        stage.addEventListener(Event.RESIZE,resizeHandler);
                        loadTimer=new Timer(100,1);
                        loadTimer.addEventListener(TimerEvent.TIMER, resizeHandler);
 
                        format=new ElementFormat  ;
                        var fontDescription:FontDescription=new FontDescription("Arial");
                        format.fontSize=16;
                        format.fontDescription=fontDescription;
                        getSubstring('"Мы любим тех, кто нас не любит.:-)'+
                        'Не любим тех, кто любит нас.:-D'+
                        'Легко доставшиеся губы,:-)'+
                        'не радуют, а обжигают нас.:-)'+
                        'Любя далёкое, томимся,:-)'+
                        'в тоске проводим дни свои.8-)'+
                        'Мы любим то, к чему стремимся,8-)'+
                        'а как достигнем, нет любви.":-D',smileName);
                        TF=new MovieClip  ;
                        addChild(TF);
                }
 
                private function resizeHandler(event:Event):void {
                        var now:Date = new Date();
                        trace(now.getMilliseconds());
                        var textElement:TextElement;
                        var graphicElement:GraphicElement;
                        var groupVector:Vector.<ContentElement>=new Vector.<ContentElement>  ;
                        if (mc_array.length>0) {
                                for (var i:Number=0; i<mc_array.length; i++) {
                                        textElement=new TextElement(mc_array[i].xt,format);
                                        graphicElement=new GraphicElement(mc_array[i].img,mc_array[i].img.width,mc_array[i].img.height,format);
                                        groupVector.push(graphicElement,textElement);
                                }
                        }
                        var groupElement=new GroupElement(groupVector);
                        textBlock.content=groupElement;
                        createTextLines(textBlock);
                        var now:Date = new Date();
                        trace('end  '+now.getMilliseconds());
                }
 
                private function createTextLines(textBlock:TextBlock):void {
                        while (TF.numChildren) {
                                TF.removeChildAt(0);
                        }
                        var yPos=0;
                        var line_length:Number=stage.stageWidth-10;
                        var textLine:TextLine=textBlock.createTextLine(null,line_length);
                        while (textLine) {
                                TF.addChild(textLine);
                                textLine.x=10;
                                yPos+=textLine.height+2;
                                textLine.y=yPos;
                                textLine=textBlock.createTextLine(textLine,line_length);
                        }
                }
 
                function reDrawSmile(event:Event):void {
                        trace(event.target.name);
                        loadTimer.start();
                        if (event.target.height>30) {
                                event.target.scaleX=0.4;
                                event.target.scaleY=0.4;
                        }
                }
 
                function getSubstring(txt:String,smile:Array):void {
                        var ia:Array;
                        var index:String;
                        for (var i=0; i<smile.length; i++) {
                                if (i<10) {
                                        index='0'+i;
                                }
                                txt=txt.split(smile[i]).join('[!img!]'+index+' ');
                        }
                        ia=txt.split('[!img!]');
                        for (var j=0; j<ia.length; j++) {
                                if (ia[j].length>0) {
                                        j==0?index='':index=ia[j].substr(0,2);
                                        var box=new LoaderExample  ;
                                        if (index!='') {
                                                super.addEventListener('load.Complate',this.reDrawSmile);
                                                box.load(smileNameLink[Number(index)]);
                                        }
                                        mc_array.push({img:box,xt:ia[j].substr(index.length)});
                                }
                        }
                        loadTimer.start();
                }
        }
}


WGR 31.10.2008 03:15

Вложений: 1
да.. Видимо рановато про CS4 ещё спрашивать что либо :bb:
Пробывал выделять текст в text.engine. Больше времени потратил на подсветку выделения!
Код:

package {
        import flash.display.Sprite;
        import flash.text.engine.*;
        import flash.events.MouseEvent;
        import flash.events.EventDispatcher;
        import flash.ui.Mouse;
        import flash.geom.Rectangle;
        import flash.geom.Point;
        import LoaderExample;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;

        public class TextLineMirrorRegionExample extends Sprite {
                var myEvent:EventDispatcher=new EventDispatcher  ;
                var fontDescription:FontDescription=new FontDescription  ;
                var textBlock:TextBlock=new TextBlock  ;
                var aD:Number;
                var aM:Number;
                var aU:Number;
                var aDline:Number;
                var aMline:Number;
                var aUline:Number;
                var beginLine:TextLine;
                var endLine:TextLine;
                var lineWidth:Number=250;
                var xPos:Number=55;
                var yPos:Number=80;
                var select:Sprite;
                var label:TextField;
                var textLabel:String="Выделенный текст=";

                public function TextLineMirrorRegionExample():void {

                        fontDescription.fontWeight="bold";
                        var blackFormat:ElementFormat=new ElementFormat  ;
                        blackFormat.fontSize=18;
                        blackFormat.color=0x000000;
                        blackFormat.fontDescription=fontDescription;

                        var textElement1=new TextElement("aD- atom in TextBlok (mouseDown)!!!!!!!!!!!!",blackFormat);
                        var textElement2=new TextElement("aM- atom in TextBlok (mouseMove)!!!!!!!!!!!!",blackFormat);
                        var textElement3=new TextElement("aU- atom in TextBlok (mouseUp)!!!!!!!!!!!!!!",blackFormat);
                        var textElement4=new TextElement("aDline, aMline, aUline- позиция атомов относительно их линии (D-нажатие, M-наведение, U-отпускание)",blackFormat);
                        var textElement5=new TextElement("select- спрайт с выделением линии. PS немного касячет подсветка при выделение снизу",blackFormat);

                        label=createLabel();
                        label.y=10;
                        label.x=330;
                        label.autoSize=TextFieldAutoSize.LEFT;
                        label.wordWrap=true;
                        addChild(label);

                        var box=new LoaderExample  ;
                        box.load('1.swf');
                        var graphicElement:GraphicElement=new GraphicElement(box,20,20,blackFormat);

                        myEvent.addEventListener("mouseOut",mouseOutHandler);
                        myEvent.addEventListener("mouseOver",mouseOverHandler);
                        myEvent.addEventListener("mouseUp",mouseUpHandler);
                        myEvent.addEventListener("mouseDown",mouseDownHandler);
                        myEvent.addEventListener("mouseMove",mouseMoveHandler);

                        var groupVector:Vector.<ContentElement>=new Vector.<ContentElement>  ;
                        groupVector.push(textElement1,textElement2,textElement3,graphicElement,textElement4,textElement5);
                        var groupElement:GroupElement=new GroupElement(groupVector);
                        groupElement.eventMirror=myEvent;

                        textBlock.content=groupElement;
                        createLines(textBlock);
                }

                private function createLabel():TextField {
                        var txtField:TextField=new TextField  ;
                        txtField.text=textLabel;
                        return txtField;
                }

                private function mouseOverHandler(event:MouseEvent):void {
                        Mouse.cursor="ibeam";
                }

                private function mouseOutHandler(event:MouseEvent):void {

                        Mouse.cursor="arrow";
                }

                private function mouseUpHandler(event:MouseEvent):void {
                        var line:TextLine=event.target as TextLine;
                        var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
                        var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
                        aUline=AL;
                        aMline=AL;
                        aU=AB;
                        if (aD<aU) {//достаём выделенный текст, а всё остальное лишь подсветка выделения
                                label.text=textLabel+line.textBlock.content.rawText.substr(aD,aU-aD);
                        } else {
                                label.text=textLabel+line.textBlock.content.rawText.substr(aU,aD-aU);
                        }

                        showAtoms(line,AL);
                        endLine=line;
                        if (aD==aU) {
                                removeAtoms();
                        } else {
                                showAtoms2(beginLine,line);
                        }
                }

                private function mouseDownHandler(event:MouseEvent):void {
                        removeAtoms();
                        var line:TextLine=event.target as TextLine;
                        var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
                        var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
                        aDline=AL;
                        aD=AB;
                        showAtoms(line,AL);
                        beginLine=line;
                }
                private function mouseMoveHandler(event:MouseEvent):void {
                        if (event.buttonDown) {
                                var line:TextLine=event.target as TextLine;
                                var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
                                var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
                                aMline=AL;
                                aM=AB;
                                endLine=line;
                                showAtoms(line,AL);
                                showAtoms2(beginLine,line);
                        }

                }
                private function showAtoms(textLine,begin):void {
                        var bounds:Rectangle=textLine.getAtomBounds(begin);
                        drawLineShadow(textLine,bounds.left,bounds.top,bounds.width,bounds.height);
                }

                private function showAtoms2(begin,end):void {
                        removeAtoms();
                        var beginR:Rectangle=begin.getAtomBounds(aDline);
                        var endR:Rectangle=end.getAtomBounds(aMline);
                        if (aD>aU) {//если атом на который нажали дальше, то меняем местами
                                var tTemp:TextLine=begin;
                                begin=end;
                                end=tTemp;
                                trace(aDline);
                                beginR=end.getAtomBounds(aMline);
                                endR=begin.getAtomBounds(aDline);
                        }

                        var tLine:TextLine=begin;
                        var tR:Rectangle=tLine.getAtomBounds(0);

                        if (end!=begin) {//первая линия
                                drawLineShadow(tLine,beginR.left,tR.top,tLine.textWidth-beginR.left,tLine.textHeight);
                                tLine=tLine.nextLine;
                        } else {
                                drawLineShadow(tLine,beginR.left,tR.top,endR.left-beginR.left,tLine.textHeight);
                        }

                        while (tLine!=end) {//промежуточные линии
                                tR=tLine.getAtomBounds(0);
                                drawLineShadow(tLine,tR.left,tR.top,tLine.textWidth,tLine.textHeight);
                                tLine=tLine.nextLine;
                        }
                        if (end!=begin) {//если выделили больше одной линии
                                if (tLine==end) {//последняя линия
                                        tR=tLine.getAtomBounds(0);
                                        drawLineShadow(tLine,tR.left,tR.top,endR.left,tLine.textHeight);
                                }
                        }
                }

                private function drawLineShadow(tLine,l,t,w,h):void {
                        var box:Sprite=new Sprite  ;
                        var mcGraphics=box.graphics;
                        mcGraphics.beginFill(0x00FF00,0.3);
                        mcGraphics.drawRect(l,t,w,h);
                        mcGraphics.endFill();
                        //добавляем зелёного ребёнка чтобы узнать положение линии
                        // может кто другой вариант предложит?
                        tLine.addChild(box);
                        var cPoint:Point=box.localToGlobal(new Point(box.x,box.y));
                        box.x=cPoint.x-xPos;
                        box.y=cPoint.y-yPos;
                        tLine.removeChildAt(tLine.numChildren-1);
                        select.addChild(box);
                }

                private function removeAtoms():void {
                        while (select.numChildren) {
                                select.removeChildAt(0);
                        }
                }

                private function createLines(textBlock:TextBlock):void {
                        select=new Sprite  ;
                        select.x=xPos;
                        select.y=yPos;
                        addChild(select);
                        var purgeLine:TextLine=textBlock.firstLine;

                        while (purgeLine) {
                                removeChild(purgeLine);
                                purgeLine=purgeLine.nextLine;
                        }
                        var yP:Number=yPos;

                        var textLine:TextLine=textBlock.createTextLine(null,lineWidth);

                        while (textLine) {
                                textLine.x=xPos;
                                textLine.y=yP;
                                yP+=textLine.height+2;
                                addChild(textLine);
                                textLine=textBlock.createTextLine(textLine,lineWidth);
                        }

                }
        }
}

Думаю, я тут перемудрил с позициями линий :away:
Завтра попробую другим методом подсветить выделение.

_Smirnoff 31.10.2008 12:26

Код:

myEvent.addEventListener("mouseOut",mouseOutHandler);
Не надо так писать event.type


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

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