学习flex自定义事件,其实很大程度上是对两大机制进行熟悉,1.事件机制 2.显示对象,

对于事件机制,很多初学者知其言,未必知其所以言

为此,写下此篇文章,贡献一下!!


可以好肯定地说,只要是用心学习了flex自定义事件和显示架构(显示对象类层次分布)两大知识点,则对于 面向对象编程思想是一个不可多得的质和量的提高!!



本帖内容提要:

1.简述事件前世今生

2.AS3.0基本事件机制

3.AS3.0事件流机制

4.AS3.0自定义事件机制

5.设计模式“观察者模式” VS  AS3事件机制


本帖所有附件中FLA文件均使用Flash CS3编写,请使用CS3或CS3以上版本打开

===========================================


1.简述事件前世今生


首先我们来回顾一下as2、as3相关的基本控制代码,


假设场景中有一个影片剪辑(mc_a),有一个按钮(btn_mca),我们需要点击按钮时控制mc的_x属性自加5,代码分两种情况如下



as2.0:

====================================

//代码写在按钮身上

on(release){

      //trace("代码写在按钮身上,当前this指向:" + this);

      mc_a._x+=5;

}



//代码写在时间轴上

btn_mcb.onRelease = function(){

      //trace("代码写在时间轴上,当前按钮的处理函数this指向:" + this);

      this._parent.mc_b._x+=5;

}


as3.0:

====================================

//代码只可能写在时间轴或类文件中,此处为教学暂时仅讨论时间轴代码

btn_mca.addEventListener(MouseEvent.CLICK, onClick_func);


function onClick_func(_evt:MouseEvent):void{

      //_evt.currentTarget._x += 5;

      mc_a.x += 5;

}






看了上面的代码,是不是很熟悉呢?

我们写代码的时候,总喜欢去访问、去干预别人(其它对象)的行为

会用很多_root、很多_parent,这对于编写过as2.0的人来,应该不陌生了吧


PS:这阶段是很多初学者的基本理解,要为什么东西加鼠标事件,就写对应代码就可以了,反正有多少个按钮就加多少个鼠标


事件代码。




写代码时最怕的就是需求更改,而需求更改就像给代码松一松土,一松土,如果有问题就肯定会显现出来!!!



========================================================================



对于事件处理来说,我们习惯的理解就是



btn_mca.addEventListener(MouseEvent.CLICK, onClick_func);

//元件.侦听(鼠标事件.单击事件, 处理函数);


function onClick_func(_evt:MouseEvent):void{

// 处理函数(_evt:事件类型):void{

      mc_a.x += 5;

      //具体处理代码

}




反正做什么事就写什么代码,其实这就是 面向过程编程 中的先入为主式编程,一下笔就考虑具体功能,

对于一般处理固化的代码来说没什么,但出现如下的情况下的时候,我们就需要考虑一个事件回调的问题了




我们在这里做一个小游戏,如图所示,一个按钮+三个影片剪辑

要实现的效果是,用鼠标点击对应的影片剪辑,然后点击按钮,对应的影片剪辑就会移动,并显示对应自己的x坐标信息.



按钮实例名是 btn_moveMC ,影片剪辑实例名分别是 mc_a mc_b mc_c ,影片剪辑内还有一个动态文本框,实例名是txt_Info



as2.0:

====================================

var _obj:MovieClip = mc_a; //初始化绑定 mc_a

var 距离:Number = 10;


mc_a.onRelease = function(){

      _obj = mc_a;

}

mc_b.onRelease = function(){

      _obj = mc_b;

}

mc_c.onRelease = function(){

      _obj = mc_c;

}


btn_moveMC.onRelease = function(){

      _obj.txt_Info.text = int(_obj._x);

      _obj._x += 距离;

}





as3.0:

====================================

var _obj:MovieClip = mc_a; //初始化绑定 mc_a

var 距离:uint = 10;


mc_a.buttonMode = true;

mc_b.buttonMode = true;

mc_c.buttonMode = true;


mc_a.addEventListener(MouseEvent.CLICK,onClick_mcA_func);

mc_b.addEventListener(MouseEvent.CLICK,onClick_mcB_func);

mc_c.addEventListener(MouseEvent.CLICK,onClick_mcC_func);


btn_moveMC.addEventListener(MouseEvent.CLICK,onClick_func);


function onClick_mcA_func(_evt:MouseEvent):void{

      _obj = mc_a;

}


function onClick_mcB_func(_evt:MouseEvent):void{

      _obj = mc_b;

}


function onClick_mcC_func(_evt:MouseEvent):void{

      _obj = mc_c;

}


function onClick_func(_evt:MouseEvent):void{

      _obj.txt_Info.text = uint(_obj.x);

      _obj.x += 距离;

}