精彩专题推荐:建站之入门课 建站之必修课 建站之关键课 网站价值所在 流量提高专题 css+div 标准 个人网站打造全过程
返回建站学首页
导航:
建站首页 | 网站设计 | 网站开发 | 网站运营 | 网页软件 | 建站指南 | 搜索优化 | 图像处理 | 视频教程 | 书籍教程 | 建站专题
当前位置:首页>网页软件>FLASH教程>正文

Flash AS2 事件处理机制


来源:不详 时间:07-07-13 点击: 点击这里收藏本文

这一节讲 EventDispatcher 类.此类也是提供事件通知和侦听器管理功能的,但比前面讲的功能会强一些.在 AS2
中,此类用于组件的事件处理机制中.因 Macromedia 没有过多的讲解此类.很少人将它用于自定义类中.本人在研究
mx包下的类时才知道此类的用法.

首先看看在组件中如何使用:
1.

function clickHandler(evt:Object):Void
{
    trace("click");
]
button.addEventListener("click", clickHandler);

2.

function click(evt:Object):Void
{
    trace("click");
]
button.addEventListener("click", this);

3.

function handleEvent(evt:Object):Void
{
    trace("click");
]
button.addEventListener("click", this);

4.

button.clickHandler = function(evt:Object)
{
    trace("click");
}

这几种写法其效果都是一样的.都是侦听 button 实例的 click 事件.

下面来了解此类详细:
public addEventListener(eventName:String, 侦听器对象或函数):Void              ---添加事件侦听器
public removeEventListener(eventName:String, 侦听器对象或函数):Void              ---移除事件侦听器
public dispatchEvent(eventObj:Object):Void          object:Object):Void

帮助文档中没有讲解 initialize 方法.此方法的功能同 AsBroadcaster 类的 initialize 方法一样.

该怎么用呢? 看下面的示例:
[5.1.示例: EDEventClass 类(简单的示例)]
此示例文档详细:
Example/AS2/events/EDEvent/EDEventClass.as
Example/AS2/events/EDEvent/EDEventExample.as
Example/AS2/events/EDEvent/EDEventExample.xml
Example/AS2/events/EDEvent/EDEventExample.fla

主类:
打开 EDEventClass.as 文档,输入下面的代码:

import mx.utils.Delegate;
import mx.events.EventDispatcher;
//----------------------------------------
class EDEventClass extends EventDispatcher
{
    //----------------------------------------
    public var tXML:XML;
    //----------------------------------------
    public function EDEventClass(url:String)
    {
        this.tXML = new XML();
        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
        this.tXML.load(url);
    }
    private function XMLonLoad(success:Boolean):Void
    {
        if (success) {
            this.dispatchEvent({type:"complete"});
        }
    }
    //----------------------------------------
}

如果不继承 EventDispatcher 类.请将代码改成如下:

import mx.utils.Delegate;
import mx.events.EventDispatcher;
//----------------------------------------
class EDEventClass
{
    //----------------------------------------
    //不继承需添加这三个方法.
    public var addEventListener:Function;
    public var removeEventListener:Function;
    private var dispatchEvent:Function;
    //----------------------------------------
    public var tXML:XML;
    //----------------------------------------
    public function EDEventClass(url:String)
    {
        //还有使用 initialize 静态方法.
        EventDispatcher.initialize(this);
        this.tXML = new XML();
        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
        this.tXML.load(url);
    }
    private function XMLonLoad(success:Boolean):Void
    {
        if (success) {
            this.dispatchEvent({type:"complete"});
        }
    }
    //----------------------------------------
}

保存文档.
这里首导入 EventDispatcher 类,你可以选择继承或不继承此类.上面的代码一个是继承,一个是不继承.区别
也很容易看出来.这里就不讲了.

示例类:
打开 EDEventExample.as 文档,输入下面的代码:

import EDEventClass;
//----------------------------------------
class EDEventExample
{
    public function EDEventExample()
    {
        var ee:EDEventClass = new EDEventClass("EDEventExample.xml");
        ee.addEventListener("complete", this);
    }
    private function complete(evt:Object):Void
    {
        trace("complete");
    }
}

保存文档.
在示例类中我们创建主类的一个实例.来加载 EDEventExample.xml 文档.然后添加侦听器.
如果要移除事件侦听器,请使用下面的方法:

ee.removeEventListener("complete", this);
要加载的 XML 文档:
打开 EDEventExample.xml 文档,随便输入一些内容便可.测试用.

示例 fla 文档:
打开 EDEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:

new EDEventExample();
保存文档.
测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容

complete
如需给事件传递参数,在发送事件时将参数添加事件对象(请看:1.事件处理机制)中,如下添加:

this.dispatchEvent({type:"complete", 参数1:"参数1", 参数2:"参数2", 参数N:"参数N");
在调用事件时:

private function complete(evt:Object)
{
    trace([evt.type, evt.target, evt.参数1, evt.参数2, evt.参数N]);
}

下面再看一个示例:
[5.2.示例: EDTimer 类(定时器)]
此示例文档详细:
Classes/AS2/utils/EDTimer.as
Example/AS2/utils/EDTimer/EDTimerExample.as
Example/AS2/utils/EDTimer/EDTimerExample.fla

主类:
打开 EDTimer.as 类,输入下面的代码(当不急时,应多打代码(有利于巩固知识).不应 copy/paste):

import mx.utils.Delegate;
import mx.events.EventDispatcher;
//------------------------------
class AS2.utils.EDTimer extends EventDispatcher
{
    //------------------------------
    private var _timerID:Number;
    private var _delay:Number;
    private var _repeatCount:Number;
    private var _currentCount:Number = 0;
    private var _running:Boolean;
    //------------------------------
    /*
    @parameter    delay:            延迟,单位毫秒.
    @parameter    repeatCount:    重复次数.默认为Infinity(正无穷大);
    */
    public function EDTimer(delay:Number, repeatCount:Number)
    {
        if (isNaN(delay)) {
            return;
        }
        if (isNaN(repeatCount)) {
            repeatCount = Infinity;
        }
        this._delay = delay;
        this._repeatCount = repeatCount;
    }
    //------------------------------
    public function reset():Void
    {
        this._currentCount = 0;
        this.stop();
    }
    public function start():Void
    {
        this._timerID = setInterval(Delegate.create(this, this.startTimer), this._delay);
        this._running = true;
    }
    public function stop():Void
    {
        clearInterval(this._timerID);
        this._running = false;
    }
    public function toString():String
    {
        return "[EDTimer]";
    }
    //----------------------------------------
    private function startTimer():Void
    {
        this._currentCount++;
        this.dispatchEvent({type:"timer", currentCount:this._currentCount});
        if (this._currentCount == this._repeatCount) {
            this.reset();
            this.dispatchEvent({type:"timerComplete"});
        }
    }
    //------------------------------
    public function get delay():Number
    {
        return this._delay;
    }
    public function set delay(d:Number):Void
    {
        this._delay = d;
    }
    public function get repeatCount():Number
    {
        return this._repeatCount;
    }
    public function set repeatCount(r:Number):Void
    {
        this._repeatCount = r;
    }
    public function get currentCount():Number
    {
        return this._currentCount;
    }
    public function get running():Boolean
    {
        return this._running;
    }
    //------------------------------
}

因此类详细前面已讲,功能一样,只是事件处理机制不同而已.这里就不再啰嗦.

示例类:
打开 EDTimerExample.as 文档,输入下面的代码:

import AS2.utils.EDTimer;
//----------------------------------------
class EDTimerExample
{
    //----------------------------------------
    public function EDTimerExample()
    {
        var te:EDTimer = new EDTimer(1000, 5);
        te.addEventListener("timer", this);
        te.addEventListener("timerComplete", this);
        te.start();
    }
    private function timer(evt:Object):Void
    {
        trace("timer: " + evt.currentCount);
    }
    private function timerComplete(evt:Object):Void
    {
        trace(evt.type);
    }
    //----------------------------------------
}

示例 fla 文档:
打开 EDTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:

new EDTimerExample();
测试 Flash 文档.输出面板会陆续显示以下的内容:

timer: 1
timer: 2
timer: 3
timer: 4
timer: 5
timerComplete

下一节:[6.建立强大的事件处理机制]

[6.建立强大的事件处理机制]

这一节讲建立强大的事件处理机制.学完这节,如果有接触过 AS3 的,马上会想到一句:这不就是 AS3 的事件处理机制吗?
的确.可以说跟 AS3 的事件处理机制一模一样.但还是有个作用域的问题.这节对想学习 AS3 的事件处理机制会有很大
帮助.如果你掌握这节中的内容,在 AS3 中就只有语法问题.也就会很快进入状态.毕竟是"水往低处流,人往高处走".对现
在用 AS2 的,学 AS3 是迟早的问题.不过 AS2 在新版本出来之前还是会很有用的(个人的看法).

9 7 3 1 2 3 4 5 4 8 :

  把此文章收藏到:          
广而告之
文章搜索
  • Google JZxue.Com

关于我们 | 联系我们 | 友情链接 | 网站地图
Copyright © 2005 - 2006 建站学 All rights reserved.