注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

游戏记忆...

竹石 Blog

 
 
 

日志

 
 

使用文本引擎制作图文混排控件  

2009-11-08 15:01:31|  分类: as/flash |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
blianchen     2009.11.8  

flash10中新加入的api
引:
Flash 文本引擎 (FTE) 为文本度量、格式设置和双向文本的复杂控制提供较低级别的支持。它提供了改进的文本流和增强的语言支持。尽管可以使用 FTE 创建和管理简单的文本元素,但设计 FTE 的主要目的在于为开发人员创建文本处理组件提供基础。因此,Flash 文本引擎采用了更高级的编程技术。若要显示简单的文本元素,请参阅前面介绍 TextField 以及相关对象的用法的部分。

文本引擎在flash.text.engine下,主类有TextBlock,TextLine,ElementFormat ,TextElement ,GraphicElement ,GroupElement 。
TextBlock是一个工厂,负责创建TextLine
TextLine代表一行文本,继承显示对象。把一个文本行添加到舞台上既可以显示该行内容
ElementFormat 设置一个显示元素的显示格式
TextElement ,GraphicElement为基本的显示元素,一个文本行可以由多个元素组成
GroupElement 用来辅助组织基本显示元素

使用:
1。 换行:换行由textBlock.createTextLine(null,500);的第二个指定宽度决定,当文本需要的显示宽度大于指定的宽度时,则会换行。引擎不会自动产生换行,需要根据createTextLine的返回值来判断。
            var yPos=60;
            var textLine:TextLine=textBlock.createTextLine(null,500);
           
            while (textLine != null) {
                textLine.x=15;
                yPos += textLine.textHeight+10;
                textLine.y = yPos;
               
                textLineArr.push(textLine);
                addChild(textLine);

                textLine=textBlock.createTextLine(textLine,500);
            }
2。 事件:需使用事件镜像


例子:

代码:
package {
    import flash.text.engine.*;
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Graphics;
    import flash.events.*;
    import flash.ui.Mouse;
    import flash.geom.Rectangle;
    import flash.system.*;
   
    public class Chat extends Sprite{
       
        private var strAll:String;
       
        private var t1:test1;
       
        private var textBlock:TextBlock;
        private var textLineArr:Vector.<TextLine> = new Vector.<TextLine>();
       
        public function Chat() {
           
            this.addEventListener(Event.COPY, copy);
           
            this.addEventListener(Event.SELECT_ALL, selectAll);
//            stage.focus = this;
//            dispatchEvent(new Event(Event.SELECT_ALL));

this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUp);

   
            var str:String = "Beware of Dog!";
            var str1:String = "Beware of Dog! 钟国uohahaha n sdf sdf df dsf jjjjjj  \nhnn文件 sfddff";
            var str2:String = "Click!!!点这里";
           
            strAll = str + str2 + str1;
           
            t1 = new test1();
            t1.mouseEnabled = false;
           
     
            var format:ElementFormat = new ElementFormat();
            format.fontSize = 30;
             
            var format2:ElementFormat = new ElementFormat();
            format2.fontSize = 30;
            format2.color = 0x0000ff;
            format2.fontDescription = new FontDescription("_sans", "bold");
            
            var textElement:TextElement = new TextElement(str, format);
            var textElement1:TextElement = new TextElement(str1, format);
            var textElement2:TextElement = new TextElement(str2, format2);
            var graphicElement:GraphicElement = new GraphicElement(t1, t1.width, t1.height, format);
           
           
            var myEvent:EventDispatcher = new EventDispatcher();
            //myEvent.addEventListener("click", clickHandler);
            myEvent.addEventListener("mouseOut", mouseOutHandler);
            myEvent.addEventListener("mouseOver", mouseOverHandler);
           
            var myEvent2:EventDispatcher = new EventDispatcher();
            myEvent2.addEventListener("click", clickHandler2);
            myEvent2.addEventListener("mouseOut", mouseOutHandler2);
            myEvent2.addEventListener("mouseOver", mouseOverHandler2);
           
            textElement2.eventMirror=myEvent2;
           
            //graphicElement.eventMirror=myEvent;
            //textElement1.eventMirror=myEvent;
           
           
            var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>();
            groupVector.push( textElement, graphicElement,textElement2, textElement1);
            var groupElement = new GroupElement(groupVector);
            groupElement.eventMirror=myEvent;
           
            textBlock = new TextBlock();
            textBlock.content = groupElement;
            createLines(textBlock);
        }

        private function createLines(textBlock:TextBlock):void {
            var yPos=60;
            var textLine:TextLine=textBlock.createTextLine(null,500);
           
            while (textLine != null) {
                textLine.x=15;
                yPos += textLine.textHeight+10;
                textLine.y = yPos;
               
                textLineArr.push(textLine);
                addChild(textLine);

                textLine=textBlock.createTextLine(textLine,500);
            }
        }
   
        private function mouseOverHandler(event:MouseEvent):void
        {
            Mouse.cursor = "ibeam";
        }
       
        private function mouseOutHandler(event:MouseEvent):void
        {
            Mouse.cursor = "arrow";
        }
       
        private function clickHandler2(e:MouseEvent):void
        {
           
            if (t1.alpha == 1)
            {
                t1.alpha = 0.3;
            } else {
                t1.alpha = 1;
            }
        }
        private function mouseOverHandler2(event:MouseEvent):void
        {
            Mouse.cursor = "button";
        }
       
        private function mouseOutHandler2(event:MouseEvent):void
        {
            Mouse.cursor = "arrow";
        }
       
        private function selectAll(e:Event):void
        {
            trace("select all");
        }
       
       
       
        private var selStartRow:int = -1;
        private var selEndRow:int = -1;
        private var selStartIdx:int = -1;
        private var selEndIdx:int = -1;
        private var selCharStart:int = -1;
        private var selCharEnd:int = -1;
        private function mouseDown(e:MouseEvent):void
        {
            stage.focus = this;
           
           
            this.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
           
            var rowIndex:int = -1;
            var colIndex:int = -1;
            var tl:TextLine = textBlock.firstLine;
            //trace("ddddd", tl);
            while (tl != null)
            {
                rowIndex++;
                colIndex = tl.getAtomIndexAtPoint(e.stageX,e.stageY);
               
                if (colIndex > -1)
                {
                    selStartRow = rowIndex;
                    selStartIdx = colIndex;
                    selCharStart = tl.getAtomTextBlockBeginIndex(colIndex);
                    trace("select start:", selStartRow, selStartIdx, selCharStart);
                    return;
                }
               
                tl = tl.nextLine;
                //trace(tl);
            }
           
           
        }
       
        private function mouseUp(e:MouseEvent):void
        {
            this.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
        }
       
        private function mouseMove(e:MouseEvent):void
        {
            var rowIndex:int = -1;
            var colIndex:int = -1;
            var tl:TextLine = textBlock.firstLine;
            //trace("ddddd", tl);
            while (tl != null)
            {
                rowIndex++;
                colIndex = tl.getAtomIndexAtPoint(e.stageX,e.stageY);
               
                if (colIndex > -1)
                {
                    selEndRow = rowIndex;
                    selEndIdx = colIndex;
                    selCharEnd = tl.getAtomTextBlockBeginIndex(colIndex);
                    trace("select end:", selEndRow, selEndIdx, selCharEnd);
                   
                    var rctS:Rectangle = tl.getAtomBounds(selStartIdx);
                    var rctE:Rectangle = tl.getAtomBounds(selEndIdx);
                    //trace(tl.x, tl.y);
                    graphics.clear();
                    graphics.beginFill(0x00ff00, 1.0);
                    graphics.drawRect (tl.x+rctS.x, tl.y+rctS.y, rctE.x-rctS.x+rctE.width, tl.textHeight) ;
                   
                    return;
                }
               
                tl = tl.nextLine;
                //trace(tl);
            }
        }
       
        private function copy(e:Event):void
        {
           
            var copyStr:String = strAll.substring(selCharStart-1, selCharEnd);
            System.setClipboard(copyStr);
            trace("copy----", copyStr);
        }
    }
}


  评论这张
 
阅读(639)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018