• as3signals的使用介绍


    as3-signals,一个as3开源库,地址:https://github.com/robertpenner/as3-signals/downloads,主要功能相当于as3中的事件,但实现起来比as3自带事件机制要简单,据说运行效率是其4倍!

    在as3中自定义类,且要发送自定义事件,有两种方法:

    第一就是自定义类继承EventDispatcher类或者实现IEventDispatcher接口

    第二就是用组合的方式,在自定义类中,实例化一个可以发送事件的对象,这个对象当然必须也是继承自EventDispatcher或者实现IEventDispatcher接口

    所以,as3中要发送事件,必须跟EventDispatcher类或者IEventDispatcher接口扯上关系,而自定义事件,必须继承自Event类,如果你在运行中此事件需要转发,还得重写Event类中的clone方法。

    如果使用as3-signals这一切将会变得简单,不用自定义事件,也不用与EventDispatcher类或者IEventDispatcher接口有关系,但必须使用组合的方式使用as3-signals,即:将Signal的实例组合到需发事件的自定义类中。下面详细说一下:

    先写一个自定义数据类型UserVo:

    package vo

    {

           import flash.display.Sprite;

           public class UserVo

           {

                  public var userName:String;

                  public var age:int;

                  public var foods:Array = [3,2,3,4,new Sprite()];

                  public function UserVo()

                  {

                  }

           }

    }

    第一种常用情况,发送不带任何参数的事件,即不发送as3事件机制中的事件对象。

    自定义类:Rect,此类需要发送事件(信号)的,但我们不继承EventDispatcher也不实现IEventDispatcher接口。

    package view

    {

           import flash.display.Sprite;

           import signals.ClickSignal;

           import vo.UserVo;

           public class Rect extends Sprite

           {

                  public var clickSignal:ClickSignal;

                  public function Rect()

                  {

                         super();

                         clickSignal = new ClickSignal();

                  }

                  public function click():void

                  {

                         clickSignal.dispatch();

                  }

           }

    }

    clickSignal是用组合方式添加的事件(信号),click方法用于发送事件(信号)。使用方法:

    public function SignalsTest()

    {

           var rect:Rect = new Rect();

           rect.clickSignal.add(onClick);

           rect.click();

    }

    private function onClick():void

    {

           trace("onClick");

    }

    onClick函数是事件的监听函数。它不带任何参数。

    第二种常用情况,发送带参数的信号(事件)

    修改Rect类,如下:

    package view

    {

           import flash.display.Sprite;

           import signals.ClickSignal;

           import vo.UserVo;

           public class Rect extends Sprite

           {

                  public var clickSignal:ClickSignal;

                  public function Rect()

                  {

                         super();

                         clickSignal = new ClickSignal(Number,String,Boolean,Object);

                  }

                  public function click():void

                  {

                         clickSignal.dispatch(4,"sdfdsfdsfds",Boolean(3),new UserVo());

                  }

           }

    }

    在ClickSignal构造函数中,传入类名称:Number,String,Boolean,Object,表示ClickSignal事件会带有4个参数,数据类型分别是Number,String,Boolean,Object类型,

    如果有更多的参数,还可以继续在构造函数中的参数中增加下去,但是调用clickSignal.dispatch()方法时,参数顺序,数据类型,个数必须跟构造函数一一对应。使用方法如下:

    public function SignalsTest()

    {

           var rect:Rect = new Rect();

           rect.clickSignal.add(onClick);

           rect.click();

    }

    private function onClick(a:Number,b:String,c:Boolean,d:Object):void

    {

           trace(d is UserVo);//true

           trace(d.foods is Array);//true

           trace(d.foods[4].name,Sprite(d.foods[4]).loaderInfo);//instance2 null

           trace("onClick==>",a,b,c,d);//onClick==> 4 sdfdsfdsfds true [object UserVo]

    }

    上面的例子中,我们只知道了事件带有的参数,但并不清楚事件是谁发出来的,下面的例子即解决这个问题,下面要用到DeluxeSignal和GenericEvent类,他会作为一个事件对象传递给事件接收

    函数,在此事件对象中包含了事件的目标!

    新建自定义类:Circle,如下:

    package view

    {

           import flash.display.Sprite;

           import org.osflash.signals.DeluxeSignal;

           import org.osflash.signals.events.GenericEvent;

           public class Circle extends Sprite

           {

                  public var signal:DeluxeSignal;

                  public function Circle()

                  {

                         signal = new DeluxeSignal(this);

                  }

                  public function dispatch():void

                  {

                         signal.dispatch(new GenericEvent(),4,"6666666666");

                  }

           }

    }

    DeluxeSignal构造函数中传入的参数将会被作为事件的目标存入事件对象中(即:GenericEvent对象)。DeluxeSignal类包含了Signal类所有功能,所以发送DeluxeSignal事件(信号)也是可以自定义参数的。

    signal.dispatch(new GenericEvent(),4,"6666666666");

    dispatch方法有三个参数:

    第一个:GenericEvent对象,包含了事件的目标,是否冒泡等信息

    第二个,第三个...:是附带的参数,可以有多个参数,只需要继续往后面添加即可。

    具体使用方法如下:

    public function SignalsTest()

    {

           var circle:Circle = new Circle();

           circle.signal.add(onDispatch);

           circle.dispatch();

    }

    private function onDispatch(e:GenericEvent,a:Number,b:String):void

    {

           trace(e.signal);//[object DeluxeSignal]

           trace(e.currentTarget,e.target);//[object Circle] [object Circle]

           trace(a,b);//4 6666666666

    }

    第三种常用情况,简化as3自带的事件。

    自定义类Native,当被添加到舞台时,绘制一个矩形,当被点击时,重绘矩形。

    package view

    {

           import flash.display.Sprite;

           import flash.events.Event;

           import flash.events.MouseEvent;

           import org.osflash.signals.natives.NativeSignal;

           public class Native extends Sprite

           {

                  private var nativeSignal:NativeSignal;

                  private var clickSignal:NativeSignal;

                  public function Native()

                  {

                         nativeSignal = new NativeSignal(this,Event.ADDEDE_TO_STAG,Event);

                         nativeSignal.addOnce(draw);

                         clickSignal = new NativeSignal(this,MouseEvent.CLICK,MouseEvent);

                         clickSignal.add(onClick);

                  }

                  private function draw(e:Event):void

                  {

                         this.graphics.clear();

                         this.graphics.beginFill(0x0000ff,0.5);

                         this.graphics.drawRect(0,0,200,150);

                         this.graphics.endFill();

                  }

                  private function onClick(e:MouseEvent):void

                  {

                         this.graphics.clear();

                         this.graphics.beginFill(Math.random()*0xffffff,0.5);

                         this.graphics.drawRect(0,0,200,150);

                         this.graphics.endFill();

                  }

           }

    }

    NativeSignal类负责监听系统事件如:Event.ADDEDE_TO_STAG,MouseEvent.CLICK等,

    add方法有三个参数可以填:1.事件目标;2.事件类型;3.事件类名称

    调用clickSignal.add(onClick);后,当鼠标点击时,即会执行onClick函数。

    有关更多as3-signals的介绍可以看下面的链接:

    http://www.developria.com/2010/10/an-introduction-to-as3-signals.html

    https://github.com/robertpenner/as3-signals/downloads

  • 相关阅读:
    React 懒加载组件
    按键精灵Q语言基础
    zookeeper安装和配置(单机+伪集群+集群)
    hbase-site.xml 配置详解
    MySQL主从复制与读写分离概念及架构分析
    mysql 主从复制原理
    Struts2教程
    广告点击率预测(CTR) —— 在线学习算法FTRL的应用
    搭建git服务器
    git常用命令
  • 原文地址:https://www.cnblogs.com/ywxgod/p/2039826.html
Copyright © 2020-2023  润新知