学习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 += 距离;
}