• AS3 CookBook学习整理(八)


    1. AS3的事件机制

    事件流机制即为捕获--目标--冒泡,分别对应event.eventPhase的值1(EventPhase.CAPTURING_PHASE),2(EventPhase.AT_TARGET),3(EventPhase.BUBBLING_PHASE)

    假设有3个Sprite,分别为绿、蓝、黄(如图),层叠关系为绿色包含蓝色,蓝色包含黄色

    情况一:最顶层的黄色有一个点击事件,另外两个没有点击事件

    结果:target是--黄色方块,currentTarget是--黄色方块,阶段是--2

    情况二:三个Sprite都有一个点击事件,然后点击最上层的黄色方块

    结果:

    target是--黄色方块,currentTarget是--黄色方块,阶段是--2

    target是--黄色方块,currentTarget是--蓝色方块,阶段是--3

    target是--黄色方块,currentTarget是--绿色方块,阶段是--3

    可以看出来,event的target始终是指单击的目标,属于目标阶段;而currentTarget指向处理事件(即活动)的目标,属于冒泡阶段,currentTarget属性应具备两个条件,一是它注册了侦听器,二是正在处理事件

    package {
     import flash.display.Sprite;
     import flash.events.MouseEvent;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;
     public class Sample0413 extends Sprite
     {
      private var lblInfo:TextField;
      
      public function Sample0413()
      {
       var greenRect:Sprite = new Sprite();
       greenRect.graphics.beginFill(0x00FF00);
       greenRect.graphics.drawRect(100,100,200,200);
       greenRect.graphics.endFill();
       greenRect.addEventListener(MouseEvent.CLICK,onGreenClick);
       greenRect.name = "绿色方块";
       this.addChild(greenRect);
       
       var blueRect:Sprite = new Sprite();
       blueRect.graphics.beginFill(0x0000FF);
       blueRect.graphics.drawRect(130,130,150,150);
       blueRect.graphics.endFill();
       blueRect.addEventListener(MouseEvent.CLICK,onBlueClick);
       blueRect.name = "蓝色方块";
       greenRect.addChild(blueRect);
       
       var yellowRect:Sprite = new Sprite();
       yellowRect.graphics.beginFill(0xFFFF00);
       yellowRect.graphics.drawRect(160,160,100,100);
       yellowRect.graphics.endFill();
       yellowRect.addEventListener(MouseEvent.CLICK,onYellowClick);
       yellowRect.name = "黄色方块";
       blueRect.addChild(yellowRect);
       
       lblInfo = new TextField();
       lblInfo.background = true;
       lblInfo.x = 10;
       lblInfo.y = 20;
       lblInfo.width = 400;
       this.addChild(lblInfo);
      }
      
      private function onGreenClick(event:MouseEvent):void
      {
       this.lblInfo.appendText("你单击了绿色的方块\n");
      }
      
      private function onBlueClick(event:MouseEvent):void
      {
       this.lblInfo.appendText("你单击了蓝色的方块\n");
      }
      
      private function onYellowClick(event:MouseEvent):void
      {
       this.lblInfo.appendText("你单击了黄色的方块\n");
       //event.stopImmediatePropagation();
      }
      
      private function onClick(event:MouseEvent):void
      {
       var targetStr:String = "target是:" + (event.target  as  Sprite).name;
       var curTargetStr:String = "currentTarget是:" + (event.currentTarget  as  Sprite).name;
       var phaseStr:String = "阶段是:" + event.eventPhase;
       this.lblInfo.appendText(targetStr + "\t" + curTargetStr + "\t" + phaseStr + "\n");
      }
     }
    }

    2. FocusEvent焦点事件

    一共有4个焦点事件:FocusIn、FocusOut、KEY_FOCUS_CHANGE、MOUSE_FOCUS_CHANGE

    当焦点改变时focusIn和focusOut 事件会同时激活,它们属于不可取消的事件

    keyFocusChange和mouseFocusChange是可取消的事件,可以调用FocusEvent.preventDefault( )方法取消默认事件

    FocusEvent有一个relatedObject属性,对于focusIn而言,relatedObject属性是刚才拥有焦点的对象的;对于其它三个事件,relatedObject属性是现在接收到焦点的对象

    package {
     import flash.display.Sprite;
     import flash.events.FocusEvent;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;
     import flash.text.TextFieldType;
     public class Sample0414 extends Sprite
     {
      private var lblInfo:TextField;
      
      public function Sample0414()
      {
       var textBox:TextField = new TextField();
       textBox.name = "文本框A";
       textBox.type = TextFieldType.INPUT;
       textBox.background = true;
       textBox.width = 200;
       textBox.height = 20;
       //textBox.addEventListener(FocusEvent.FOCUS_IN,onFocusIn);
       //textBox.addEventListener(FocusEvent.FOCUS_OUT,onFocusOut);
       textBox.addEventListener(FocusEvent.KEY_FOCUS_CHANGE,onKeyFocusChange);
       this.addChild(textBox);
       
       textBox = new TextField();
       textBox.name = "文本框B";
       textBox.type = TextFieldType.INPUT;
       textBox.background = true;
       textBox.width = 200;
       textBox.height = 20;
       textBox.y = 80;
       //textBox.addEventListener(FocusEvent.FOCUS_IN,onFocusIn);
       //textBox.addEventListener(FocusEvent.FOCUS_OUT,onFocusOut);
     
       textBox.addEventListener(FocusEvent.KEY_FOCUS_CHANGE,onKeyFocusChange);
       this.addChild(textBox);
       
       lblInfo = new TextField();
       lblInfo.y = 200;
       lblInfo.autoSize = TextFieldAutoSize.CENTER;
       this.addChild(lblInfo);
      }
      
      private function onFocusIn(event:FocusEvent):void
      {
       var txt:TextField = event.target  as  TextField;
       txt.text = txt.name;
       if(event.relatedObject!=null)
       {
        lblInfo.text = "FocusIn的relatedObject是:" + (event.relatedObject  as  TextField).name;
       }
      }
      
      private function onFocusOut(event:FocusEvent):void
      {
       if(event.relatedObject!=null)
       {
        lblInfo.text = "FocusOut的relatedObject是:" + (event.relatedObject  as  TextField).name;
       }
      }
      
      private function onKeyFocusChange(event:FocusEvent):void
      {
       var txt:TextField = event.target  as  TextField;
       if(txt.text == "") 
       {
                 event.preventDefault();//当field没有任何文字前,不允许使用Tab键把焦点移除
          } 
       if(event.relatedObject!=null)
       {
    var strRelatedObj:String = (event.relatedObject  as  TextField).name; lblInfo.text = "KeyFocusChange的relatedObject是:" + strRelatedObj; } } } }

    3. 监听用户输入的文本

    通过TextEvent事件监听用户对文本框内容的修改,如删除,剪切,插入或者拷贝等操作,对文本框的每一次修改都会激活textInput事件,可以通过event.preventDefault()取消显示输入的文本

    package {
     import flash.display.Sprite;
     import flash.events.TextEvent;
     import flash.text.TextField;
     import flash.text.TextFieldType;
     public class Sample0414 extends Sprite
     {
      private var lblInfo:TextField;
      
      public function Sample0414()
      {
       var textBox:TextField = new TextField();
       textBox.type = TextFieldType.INPUT;
       textBox.background = true;
       textBox.width = 200;
       textBox.height = 20;
       textBox.addEventListener(TextEvent.TEXT_INPUT,onTextInput);
       this.addChild(textBox);
      }
      
      private function onTextInput(event:TextEvent):void
      {
       if(event.text.toLowerCase().indexOf("<script>")>-1)
       {
        event.preventDefault();
       }
      }
     }
    }

    4. 为TextField添加超链接

    同设置样式一样,也有三种方式实现:直接加入标记、设置TextFormatter、设置CSS

    设置TextFormatter:

    var textBox:TextField = new TextField();
    textBox.text = "god bless me";
    var formatter:TextFormat = new TextFormat();
    formatter.color = 0xFF0000;
    formatter.url = "http://www.baidu.com/";
    formatter.target = "_blank";
    textBox.setTextFormat(formatter);
    this.addChild(textBox);

    设置CSS:

    var textBox:TextField = new TextField();
    textBox.htmlText = "<a href='http://www.baidu.com/' target='_blank'>I love you</a>";
       
    var css:StyleSheet = new StyleSheet( );
    css.parseCSS("a {color: #FFFF00;} a:hover {text-decoration: underline;}");
    textBox.styleSheet = css;
       
    this.addChild(textBox);

    5. 用超链接调用ActionScript代码

    在一个链接地址前加上event:,即可以响应TextEvent.LINK事件。TextEvent.text属性就是url的地址

    package {
     import flash.display.Sprite;
     import flash.events.TextEvent;
     import flash.text.TextField;
     import flash.text.TextFormat;
     public class Sample0414 extends Sprite
     {
      public function Sample0414()
      {
       var textBox:TextField = new TextField();
       textBox.addEventListener(TextEvent.LINK,onClickLink);
       textBox.htmlText = "god bless me";
       var formatter:TextFormat = new TextFormat();
       formatter.color = 0xFF0000;
       formatter.url = "event:http://www.baidu.com/";
       formatter.target = "_blank";
       textBox.setTextFormat(formatter);
       
       textBox.addEventListener(TextEvent.LINK, onClickLink);
       
       this.addChild(textBox);
      }
      
      private function onClickLink(event:TextEvent):void
      {
       trace(event.text);
      }
     }
    }

    6. 高级文本布局

    TextField 类定义了一系列API用于精确控制文本布局:

    getCharIndexAtPoint(x,y) -- 得到坐标(x,y)下的字符

    getCharBoundaries(index) -- 得到索引index对应字符的Rectangle

    numLines属性 -- 得到TextField的文本行数

    getLineIndexAtPoint(x,y) -- 得到坐标(x,y)下对应的行索引

    getLineIndexOfChar(index) -- 得到索引index对应字符的行索引

    getLineLength(lineIndex) -- 得到索引lineIndex对应行的字符数

    getLineText(lineIndex) -- 得到索引lineIndex对应行的文本

    getLineOffset(lineIndex) -- 得到索引lineIndex对应行的第一个字符的索引

    getLineMetrics(lineIndex) -- 得到索引lineIndex对应行的度量信息,包括x,width,leading,height,descent,ascent相关属性

    getFirstCharInParagraph(index) -- 如果给定一个字符索引index,则返回同一段落中第一个字符的索引

    getParagraphLength(index) -- 如果给定一个字符索引,则返回包含该字符的段落的长度

    package {
     import flash.display.Sprite;
     import flash.events.MouseEvent;
     import flash.text.TextField;
     import flash.text.TextFieldType;
     public class Sample0421 extends Sprite
     {
      private var label:TextField;
      
      public function Sample0421()
      {
       var textBox:TextField = new TextField();
       textBox.type = TextFieldType.INPUT;
       textBox.multiline = true;
       textBox.htmlText = "everyone  is  no1";
       textBox.addEventListener(MouseEvent.CLICK,onClick);
       textBox.background = true;
       textBox.wordWrap = true;
       this.addChild(textBox);
       
       label = new TextField();
       label.background = true;
       label.x = 150;
       label.width = 250;
       label.height = 300;
       this.addChild(label);
      }
      
      private function onClick(event:MouseEvent):void
      {
       var txt:TextField = event.target  as  TextField;
      
       label.text = "";
       
       try
       {
        label.appendText("numLines属性值是:"+txt.numLines+"\n");
        
        label.appendText("getLineIndexAtPoint(x,y)的值是:"+
    txt.getLineIndexAtPoint(mouseX,mouseY)+"\n"); label.appendText("getLineIndexOfChar(index)的值是:"+
    txt.getLineIndexOfChar(20)+"\n"); label.appendText("getLineLength(lineIndex)的值是:"+txt.getLineLength(2)+"\n"); label.appendText("getLineText(lineIndex)的值是:"+txt.getLineText(2)+"\n"); label.appendText("getLineOffset(lineIndex)的值是:"+txt.getLineOffset(2)+"\n"); label.appendText("getLineMetrics()的宽度是:"+txt.getLineMetrics(2).width+"\n"); label.appendText("getFirstCharInParagraph(index)的值是:"+
    txt.getFirstCharInParagraph(5)+"\n"); label.appendText("getParagraphLength(index)的值是:"+
    txt.getParagraphLength(3)+"\n"); trace(txt.text.charAt(5)); } catch(ex:Error) { label.text = ex.message; } } } }

    7. 高级抗锯齿

    对于嵌入字体可通过设置文本框的antiAliasType属性为flash.text.AntiAliasType.ADVANCED,然后设置gridTypeFit和sharpness属性

    flash.text.AntiAliasType.NORMAL -- 应用常规文本消除锯齿功能。 这与 Flash Player 7 和更早版本中使用的消除锯齿类型匹配。

    应用高级消除锯齿功能,这增加了文本的可读性。 (此功能在 Flash Player 8 中可用。) 高级消除锯齿功能可以高品质呈现小尺寸的字体。 它最适合在具有大量小字号文本的应用程序中使用。 建议不要对大于 48 磅的字体使用高级消除锯齿功能

    gridFitType属性用于此文本字段的网格固定类型,仅在文本字段的 flash.text.AntiAliasType 属性设置为 flash.text.AntiAliasType.ADVANCED 时才应用此属性

    flash.text.GridFitType.NONE -- 指定无网格固定。 不强制根据像素网格调整字型中的水平线和垂直线。 此设置通常适合动画或大号字。

    flash.text.GridFitType.PIXEL -- 指定粗水平线和垂直线适合像素网格。 此设置仅适用于左对齐文本字段。 若要使用此设置,文本字段的 flash.dispaly.AntiAliasType 属性必须设置为 flash.text.AntiAliasType.ADVANCED。 此设置通常能为左对齐文本提供最佳可读性。

    flash.text.GridFitType.SUBPIXEL -- 指定粗水平线和垂直线适合 LCD 显示器上的子像素网格。 若要使用此设置,文本字段的 flash.text.AntiAliasType 属性必须设置为 flash.text.AntiAliasType.ADVANCED。 flash.text.GridFitType.SUBPIXEL 设置通常适合右对齐或居中的动态文本,有时,为了在动画与文本品质之间达到一种平衡,也可使用此设置。

    sharpness 属性范围在-400 到400,默认为0 ,它决定字体外框的清晰程度。值越低越模糊,越高越锐利。当文字比较模糊时可以设置gridFitType 为PIXEL 或SUBPIXEL 以提高清晰度

    8. 替换文本

    使用replaceSelectedText(newText)方法替换选中的文字或用replaceText(startIndex,endIndex,newText)方法替换某一范围的文字

    package {
     import flash.display.Sprite;
     import flash.events.KeyboardEvent;
     import flash.text.TextField;
     import flash.text.TextFieldType;
     public class Sample0422 extends Sprite
     {
      public function Sample0422()
      {
       var textBox:TextField = new TextField();
       textBox.type = TextFieldType.INPUT;
       textBox.background = true;
       this.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
       this.addChild(textBox);
      }
      
      private function onKeyDown(event:KeyboardEvent):void
      {
       if(event.keyCode == 13)
       {
        var txt:TextField = event.target  as  TextField;
        txt.replaceSelectedText("巫妖王之怒");
        txt.replaceText(0,2,"wow");
       }
      }
     }
    }

    9. 获取可用字体列表

    Font.enumerateFonts(bool)方法返回可用字体列表,参数默认为false,将返回一个只包括嵌入字体的列表;为true则返回一个包括所有字体(设备字体和嵌入字体)的列表

    package {
     import flash.display.Sprite;
     import flash.text.Font;
     [Embed(source="xjlFont.fon",fontName="xjl",mimeType="application/x-font-truetype")]
     public class Sample0422 extends Sprite
     {
      public function Sample0422()
      {
       var allFonts:Array = Font.enumerateFonts(true);//默认为false
     
       allFonts.sortOn("fontName", Array.CASEINSENSITIVE);
       for (var i:uint=0; i<allFonts.length; i++)
       {  
        trace(allFonts[i].fontName);
       } 
      }
     }
    }

    10. 改变颜色

    先获取可视化对象的obj.transform.colorTransform对象,然后修改该对象,再重新赋值给对象

    设置颜色,可以直接设置ColorTransform.color属性,也可以分开设置redOffset,greenOffset,blueOffset和alphaOffset;取值范围是-255到255(alpha 值范围在0 到100,与alphaOffset是不同的)

    package {
     import flash.display.Shape;
     import flash.display.Sprite;
     import flash.geom.ColorTransform;
     public class Sample0422 extends Sprite
     {
      public function Sample0422()
      {
       var rect:Shape = new Shape();
       rect.graphics.beginFill(0xFF0000);
       rect.graphics.drawRect(100,100,150,100);
       rect.graphics.endFill();
       this.addChild(rect);
       
       var ct:ColorTransform = rect.transform.colorTransform;
       //ct.color = 0x00FF00;
     
       ct.redOffset = 128;
       ct.greenOffset = 128;
       ct.blueOffset = 128;
       ct.alphaOffset = 50;
       rect.transform.colorTransform = ct;
      }
     }
    }
  • 相关阅读:
    Seafile V4.1 安装笔记
    mysql int(3)与int(11)的区别
    python命令行参数处理模块 optparse 使用参考
    Python标准库 urllib2 的使用
    Python默认模块 os和shutil 实用函数
    ApacheBench 使用教程
    ThinkPHP中PATHINFO模式优化
    Perl中的特殊内置变量详解
    Perl内置变量速查表
    eclipse jetty debug
  • 原文地址:https://www.cnblogs.com/CoderWayne/p/1778065.html
Copyright © 2020-2023  润新知