毕业论文 论文提纲 论文写作 公文范例 教育论文 教育学论文 师范教育 学术论文     论文指导*
                     
 
   
   
   
   
           
 

当前位置:课件115学培吧(kj115.com)→flash网侠教程(助你成为顶尖课件高手)→系列文章

 
 
标题:[6.建立强大的事件处理机制]
 
展示台

文章来源 作者:admin 密码:admin 整理:湖北金鹰

◇网侠教程栏目简介
    提供FLASH侠客教程和网页制作侠客教程,高手进阶教程。
    浏览过这些资源的还浏览过经典教程图文教程游戏开发教程等相关资源。

---------------

湖北金鹰课件吧

论文相关服务
 

 

[6.建立强大的事件处理机制]
这一节讲建立强大的事件处理机制.学完这节,如果有接触过 AS3 的,马上会想到一句:这不就是 AS3 的事件处理机制吗?
的确.可以说跟 AS3 的事件处理机制一模一样.但还是有个作用域的问题.这节对想学习 AS3 的事件处理机制会有很大
帮助.如果你掌握这节中的内容,在 AS3 中就只有语法问题.也就会很快进入状态.毕竟是"水往低处流,人往高处走".对现
在用 AS2 的,学 AS3 是迟早的问题.不过 AS2 在新版本出来之前还是会很有用的(个人的看法).
作用域因为一样,前面也讲过,这里就不在啰嗦.
事件对象.这里已经创建一个 Event 类(或其子类)来代替.但功能一样.
这节讲的事件处理机制的形态(代码).
发送事件:
//继承.
import AS2.events.Event;
import AS2.events.CFEventDispatcher;
class className extends CFEventDispatcher
{
...
this.dispatchEvent(new Event(Event.COMPLETE));
...
}

//不继承.
import AS2.events.Event;
import AS2.events.CFEventDispatcher;
class className
{
public var addEventListener:Function;
public var removeEventListener:Function;
private var dispatchEvent:Function;
public function className()
{
//此方法要在使用 dispatchEvent 方法前被执行.一般放于构造函数中.
CFEventDispatcher.initialize(this);
}
...
this.dispatchEvent(new Event(Event.COMPLETE));
...
}
侦听事件:
//使用自定义函数.
import AS2.events.Event;
import className;
...
var cn:className = new className();
//自定义函数.
function completeHandler(evt:Event):Void
{
trace(this); //输出: _level0.cn
}
cn.addEventListener(Event.COMPLETE, completeHandler);
...

//使用事件侦听器对象.
import AS2.events.Event;
import className;
...
var cn:className = new className();

//事件同名函数.
function complete(evt:Event):Void
{
trace(this); //输出: this(指向侦听器对象)
}
cn.addEventListener(Event.COMPLETE, this);
...
移除侦听:
//使用自定义函数.
...
cn.removeEventListener(Event.COMPLETE, completeHandler);
...

//使用事件侦听器对象.
...
cn.removeEventListener(Event.COMPLETE, this);
...
AS2.utils.CFDelegate;
AS2.events.Event;
AS2.events.CFEventDispatcher;
这些是什么?下面讲解:
[6.1.创建 CFDelegate 类(修改 Delegate 类)]
CFDelegate 类是 Delegate 类的修改版本.简化了代码(一般不用的功能).提高了执行效率.
此类文档详细:
Classes/AS2/utils/CFDelegate.as
主类:
打开 CFDelegate.as 文档.输入下面的代码:
class AS2.utils.CFDelegate
{
public static function create(scope:Object, method:Function):Function
{
var f:Function = function ()
{
method.apply(scope, arguments);
};
return f;
}
}
保存文档.
[6.2.创建 CFEventDispatcher 类(修改 EventDispatcher 类)]
CFEventDispatcher 类是 EventDispatcher 类的修改版本.简化了代码(一般不用的功能).提高了执行效率.
此类文档详细:
Classes/AS2/events/CFEventDispatcher.as
主类:
打开 CFEventDispatcher.as 文档.输入下面的代码:
*/
//----------------------------------------
class AS2.events.CFEventDispatcher
{
//----------------------------------------
//构造函数
public function CFEventDispatcher(){}
//----------------------------------------
//当不继承此类时,此属性才有效.
private static var _ed:CFEventDispatcher;
//----------------------------------------
private static function _removeEventListener(queue:Object, handler):Void
{
/*
这里主要用于删除事件数组中的事件处理器.
*/
if (queue != undefined) {
var l:Number = queue.length;
while(l--){
if(queue[l] == handler){
queue.splice(l, 1);
return;
}
}
}
}
//当不继承此类时.此方法有效.
public static function initialize(o:Object):Void
{
/*
如果没有继承此类,而是使用 initialize 此方法时, _ed 等于 undefined.然后创建此类的实例.
最后将事件通知和侦听器管理功能添加到 initialize 方法中的对象 o.
前面所讲的不继承此类时需添加的三个方法,其实是四个.还有 dispatchQueue 方法.但此方法在
调用 dispatchEvent 方法时就会自动调用.可能有人会问,为什么没有定义就能调用?因为在函数
中可以操作对象.从而对对象动态添加方法和属性.这里就是用了在函数中操作对象.
*/
if (_ed == undefined) {
_ed = new CFEventDispatcher();
}
o.addEventListener = _ed.addEventListener;
o.removeEventListener = _ed.removeEventListener;
o.dispatchEvent = _ed.dispatchEvent;
o.dispatchQueue = _ed.dispatchQueue;
}
//----------------------------------------
private function dispatchQueue(queueObj:Object, eventObj:Object):Void
{
/*
这里主要用于判断事件处理器是对象还是函数.
*/
if (queueObj[eventObj.type] != undefined) {
for (var i:String in queueObj[eventObj.type]) {
var o = queueObj[eventObj.type][i];
if (typeof (o) == "object" typeof (o) == "movieclip") {
//调用对象中的handleEvent函数.
//if (o.handleEvent != undefined) {
//o.handleEvent(eventObj);
//}
//调用对象中的事件同名函数.
//if (o[eventObj.type] != undefined) {
//if (o[eventObj.type] != undefined) {
o[eventObj.type](eventObj);
//}
} else {
//调用自定义函数.
o.apply(queueObj, [eventObj]);
}
}
}
}
public function dispatchEvent(eventObj:Object):Void
{
//将事件源始终指向this(应用此类的对象).
eventObj.target = this;
//此句对动态类,或在类中定义"事件名Handler" 这样的函数时才有效.在这里我注释了这句.你如果你想用,可以启用它.
/*
用法: 对象.事件名Handler = function(evt:Object){};
*/
//this[eventObj.type + "Handler"](eventObj);
this.dispatchQueue(this, eventObj);
}
public function addEventListener(event:String, handler):Void
{
//这里可以这样理解:
/*
使用
addEventListener("click", 事件处理器);
添加事件.
这时, this["click"] 就等于 undefined.
(this["click"] == undefined) = true
然后将创建一个新数组来存储事件处理器.
this["click"] = [];
然后执行
CFEventDispatcher._removeEventListener(this["click"], 事件处理器);
来检测此事件是否有相同的事件处理器.如果是就删除它.
举个例:当你在一个网站注册用户名时.网站的注册程序会从数据库中检测是否有与你相同的用户名.
如果有将会提示你重新输入用户名(在这里就是直接删除了).如果没有就会注册成功(这里就在后面
执行 push).但是网站的注册程序不会从数据库中检测是否有与你相同的密码.
就是说一个事件,可添加多个不同的事件处理器,但不能添加相同的事件处理器.
当添加新的事件时,也是一样的
最后使用
this["click"].push(事件处理器);
将事件处理器添加到事件数组.
*/
if (this[event] == undefined) {
this[event] = new Array();
}
//ASSetPropFlags 是隐藏的方法.用它和不用它貌似没有区别.大家可以研究下.
//_global.ASSetPropFlags(this, event, 1);
CFEventDispatcher._removeEventListener(this[event], handler);
this[event].push(handler);
}
public function removeEventListener(event:String, handler):Void
{
//这里我就不啰嗦了.
CFEventDispatcher._removeEventListener(this[event], handler);
}
//----------------------------------------
}
保存文档.

 

 
课件115学培吧(湖北金鹰)欢迎您!永久免费服务网址:http://www.kj115.com
   
 

学员众多的FLASH课件学习基地,成万免费FLASH课件制作教程在线学习,还有免费内容课件教程、视频教程、课件技巧、课件探讨、课件欣赏、课件展示、实用教程、课件界面、课件脚本、课件游戏、课件下载、课件封面、课文内容图片、课文人物图片库、课件素材、图片素材、声音素材、动物素材、背景图片、背景资料、背景边框、课件顶栏图片素材、Dreamweaver教程、Dreamweaver网页课件教程、软件下载。承接学习和培训,承接课件订制,课件修改等所有课件相关服务。
本站主要业务:┃flash课件制作视频教程培训┃承接全国竞赛flash课件┃论文代写代发┃代办课件国家级获奖证书┃
联系:QQ:444860709 手机:13339817386


 
 

业务办理
鄂ICP备08005724号