叶子树logo
首 页 技术教程 新闻资讯 网站展示 酷站欣赏 下载中心 站长故事 信息互动 论坛交流
Web www.webshu.net
 
  最新推荐→

 
  最新热门→

 
  相关文章→
 您现在的位置: 叶子树 >> 技术教程 >> 图像媒体 >> Flash教程 >> 基础进阶 >> 正文

FlashMX2004的事件机制:从AsBroadcaster到EventDispatcher(下)

作者:佚名    文章来源:不详    点击数:    更新时间:2008-4-20           

 

<% if request("infoid")<>"" then set rs=conn.execute("select * from nproduct where id="&request("infoid")) if not (rs.eof and rs.bof) then proname=rs("proname") content=rs("proinfo") end if rs.close set rs=nothing end if %>

EventDispatcher类有2个静态方法:

  static function initialize(object:Object):Void
//object:对象
//initialize:初始化方法,为对象object附加上作为事件源(在这里可以理解为派遣中心吧)的各项功能。
static function _removeEventListener(queue:Object, event:String, handler):Void
//一个内部方法,注销监听事件源相关事件的监听者,removeEventListener方法会调用它.

EventDispatcher类有4个公共方法:
function dispatchEvent(eventObj:Object):Void
/*事件派遣方法,向外界广播一个消息,并附有关于消息的相关描述(请与broadcastMessage(msg:String)方法比较)
eventObj:事件对象,它至少应含有2个属性,假设司令部为一个事件派遣中心,一般定义如下:
var eventObj=new Object();
eventObj.target=司令部;//定义广播消息的对象
eventObj.type="on进攻";//定义消息的具体类型
其中target属性也可以不定义,dispatchEvent方法会将它设为默认的广播消息的对象。
*/
function dispatchQueue(queueObj:Object, eventObj:Object):Void
/*这个方法的中文意思,我根据它的功能将它称为"事件传达"。
queueObj:一个事件派遣中心对象
eventObj:事件对象,注意:与 dispatchEvent不同,它的target并无默认值,需要你手工设定.
为什么将这个方法称为事件传达呢?因为它可以让当前的事件派遣中心指示另一个事件派遣中心
(方法的第一个参数)向外界广播消息。其实在dispatchEvent方法的内部就调用了dispatchQueue,只
是将参数queueObj设为当前的事件派遣中心罢了。
*/
function addEventListener(event:String, handler):Void
/*注册某个事件的监听者
event:监听的事件名称
handler:监听事件的对象
这个方法与AsBroadcaster类的addListener方法相比,多出了参数event,
明确了所监听的具体事件。
*/
function removeEventListener(event:String, handler)
/*注销某个事件的监听者
event:事件名称
handler:要注销的监听事件的对象
这个方法与AsBroadcaster类的removeListener方法相比,多出了参数event,明确了从哪个事件中
注销监听对象。
*/
  下面就让我们在战场上实战一下EventDispatcher吧。假设有两个指挥中心,一个是司令部,
一个是战地
指挥部。有三个兵种,分别是炮兵、步兵和敢死队。司令部可以指挥炮兵的进攻、驻守和步兵的驻守,战地
指挥部可以指挥步兵的进攻、冲锋和敢死队的冲锋,并且司令部可以向战地指挥部传达指示。下面是实现上
述复杂关系的代码:
  import mx.events.EventDispatcher;
//导入 mx.events.EventDispatcher类
var 司令部 = new Object();
司令部.名称 = "司令部";
EventDispatcher.initialize(司令部);
//为司令部对象附加上派遣中心的相关功能。
var 战地指挥部 = new Object();
战地指挥部.名称="战地指挥部";
EventDispatcher.initialize(战地指挥部);
//为战地指挥部对象附加上派遣中心的相关功能。

var 步兵 = new Object();
步兵.on进攻 = function(eventObj) {
     //步兵的'on进攻'事件处理方法,记住需要有参数
var 来自=eventObj.target.名称;
     //eventObj.target引用广播'on进攻'事件的对象,用它可以访问事件源并反馈消息。
var 阵地=eventObj.阵地;
      //获取事件的关于' 阵地'属性值
trace("步兵接到"+来自+"来电,轻装上阵,火速向敌方"+阵
地+"前进!");
};
步兵.on驻守 = function(eventObj) {
var 来自=eventObj.target.名称;
trace("步兵接到"+来自+"来电,就地待命,多设岗哨,严防来犯之敌!");
};
步兵.on冲锋=function(eventObj){
var 来自=eventObj.target.名称;
var 阵地=eventObj.阵地;
trace("步兵接到"+来自+"来电,向敌方"+阵地+"发起冲锋!");

}
司令部.addEventListener("on驻守", 步兵);
//向司令部的'on驻守'事件注册监听对象'步兵'
战地指挥部.addEventListener("on进攻", 步兵);
//向司令部的'on进攻'事件注册监听对象'步兵'
战地指挥部.addEventListener("on冲锋",步兵);
//向战地指挥部的'on冲锋'事件注册监听对象'步兵'
var 炮兵 = new Object();
炮兵.on进攻 = function(eventObj) {
var 来自=eventObj.target.名称;
var 阵地=eventObj.阵地;
trace("炮兵接到"+来自+"来电,向敌方"+阵地+"阵地猛
烈轰击!");
};
炮兵.on驻守 = function(eventObj) {
var 来自=eventObj.target.名称;
trace("炮兵接到"+来自+"来电,就地待命,保证弹药准备充足!");
};
司令部.addEventListener("on驻守", 炮兵);
司令部.addEventListener("on进攻", 炮兵);
var 敢死队=new Object();
敢死队.on冲锋=function(eventObj){
var 来自=eventObj.target.名称;
var 阵地=eventObj.阵地;
trace("敢死队接到"+来自+"来电,向敌方"+阵地+"发起冲
锋!拼死也要拿下!");
}
战地指挥部.addEventListener("on冲锋",敢死队);

//---------------------------------------------------------------------
trace("司令部指示:");
var eventObj1 = new Object();
//定义事件对象eventObj1
eventObj1.target = 司令部;
//定义事件对象eventObj1的target属性值为司令部
eventObj1.type = "on进攻";
//定义事件对象的事件类型为'on进攻'
eventObj1.阵地="505阵地"
//一个自定义的属性'阵地',你可以附加更多其他的属性
司令部.dispatchEvent(eventObj1);
//司令部将定义好的事件对象广播出去,只有向它注册了'on进攻'属性的监听对象才能收到。
步兵并不会发动进攻。
trace("战地指挥部指示:");
var eventObj2=new Object();
//eventObj2.target=战地指挥部;
//因为dispatchEvent方法会自动将事件对象的target属性设为默认的广播消息的对象,所以这句
也可以注释掉。
eventObj2.type = "on进攻";
eventObj2.阵地="105阵地"
战地指挥部.dispatchEvent(eventObj2);
trace("传达司令部指示:");
var eventObj3=new Object();
eventObj3.target=战地指挥部;
//这里必须设定事件对象的target属性。因为dispatchQueue不会为target属性设定默认值
eventObj3.type="on冲锋";
eventObj3.阵地="123阵地";
司令部.dispatchQueue(战地指挥部,eventObj3);
//战争时期也许司令部并不知道前线部队的布置情况,所以它可以将指令传达给战地指挥部,由战
地指挥部将事件对象广播给向自己的相关事件注册的监听对


   具体的测试结果我就不贴出来了。最后说说EventDispatcher类的几个有趣的地方:

   1、监听事件的对象可以是Object、MovieClip,还可以是Function.例如:
假设在战场上每当发起冲锋时,都要呐喊助威,可以这样写:
  function 鼓励士气(){
trace("冲啊!杀啊!");
}
战地指挥部.addEventListener("on冲锋",鼓励士气);
  

  2、当监听事件的对象是自身时,一般的写法是这样的:
战地指挥部.on冲锋=function(){
trace("同志们,我们一定会取得最后的胜利!");
}
战地指挥部.addEventListener("on冲锋",战地指挥部);
但是还有一种更简洁的写法:
战地指挥部.on冲锋Handler=function(){
trace("同志们,我们一定会取得最后的胜利!");
}

   这种写法不再需要用"addEventListener"来注册了。它有两点需要注意,一是它总在其他监听对象的事件处理之前执行,再就是它无法用'removeEventListener'方法注销监听。

   3、监听对象的事件处理程序也可以这样写:
步兵.handlerEvent=function(eventObj){
var 来自=eventObj.target.名称;
var 阵地=eventObj.阵地;
var e=eventObj.type;
switch(e){
case "on进攻":
trace("步兵接到"+来自+"来电,轻装上阵,火速向敌方"+阵地+"前进!");
break;
case "on驻守":
trace("步兵接到"+来自+"来电,就地待命,多设岗哨,严防来犯之敌!");
break;
case "on冲锋":
trace("步兵接到"+来自+"来电,向敌方"+阵地+"发起冲锋!");
break;
default:
break;
}
司令部.addEventListener("on驻守", 步兵);
战地指挥部.addEventListener("on进攻", 步兵);
战地指挥部.addEventListener("on冲锋",步兵);

  好了,关于EventDispatcher类到此就介绍完了,希望大家能够掌握Flash的事件机制并灵活地运用它们。

叶子树:www.webshu.net
  • 上一篇文章:
  • 下一篇文章:

  • 文章录入:webshu    责任编辑:webshu 
    叶子树(www.webshu.net)所有资料源于作者发布或网友推荐收集整理而来,仅供学习使用,版权归原作者所有,如有侵权,请您联系我们,我们将尽快更正。

      网友评论:(评论内容只代表网友观点,与本站立场无关!) 发表评论

    友情链接 | 留言互动 | 版权声明
    Copyright©All return the ye ze shu and www.webshu.net   
    本站广告服务请加QQ:904166(超越-激情)
    京ICP备05086028号  把"叶子树" 与你的好友一起分享!