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

Flash AS2 事件处理机制


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

我们该怎么用呢? Macromedia 为我们提供了如下二个类:
AsBroadcaster 属于系统类.
BroadcasterMX 属于自定义类.类路径: mx.transitions.BroadcasterMX
这两个类的很相似.它们都是提供事件通知和侦听器管理功能.
但 AsBroadcaster 类是系统内置的.执行效率会比 BroadcasterMX 类快很多.所以这里我们就用 AsBroadcaster
类来讲解.
此类详细:
public addListener(listenerObj:Object):Boolean         ---注册侦听器.
public broadcastMessage(eventName:String):Void         ---广播消息/发送事件.
public static initialize(obj:Object):Void                ---将事件通知和侦听器管理功能添加到给指定的对象
public removeListener(listenerObj:Object):Boolean ---移除侦听器.
public _listeners:Array [只读]                                     ---对已注册侦听器对象的引用.

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

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

import mx.utils.Delegate;
//----------------------------------------
class AsBEventClass extends AsBroadcaster
{
    //----------------------------------------
    public var tXML:XML;
    //----------------------------------------
    public function AsBEventClass(url:String)
    {
        AsBroadcaster.initialize(AsBEventClass.prototype);
        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.broadcastMessage("complete");
        }
    }
    //----------------------------------------
}

保存文档.
这里首先继承 AsBroadcaster 类.然后在构造函数中使用

AsBroadcaster.initialize(AsBEventClass.prototype);
来获取事件通知和侦听器管理功能.最后使用

this.broadcastMessage("complete");
来广播消息或发送事件.
当然你也可以选择不继承它,但需要在类中添加下面的方法:

public var addListener:Function;
public var removeListener:Function;
private var broadcastMessage:Function;

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

import AsBEventClass;
//----------------------------------------
class AsBEventExample
{
    public function AsBEventExample()
    {
        var ee:AsBEventClass = new AsBEventClass("AsBEventExample.xml");
        ee.addListener(this);
    }
    private function complete():Void
    {
        trace("complete");
    }
}

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

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

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

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

complete
如需给事件传递参数,在发送事件时如下添加参数:

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

private function complete(参数1, 参数2, 参数N)
{
    trace([参数1, 参数2, 参数N]);
}

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

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

import AS2.utils.CFDelegate;
//----------------------------------------
class AS2.utils.AsBTimer extends AsBroadcaster
{
    //----------------------------------------
    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 AsBTimer(delay:Number, repeatCount:Number)
    {
        AsBroadcaster.initialize(AsBTimer.prototype);
        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(CFDelegate.create(this, this.startTimer), this._delay);
        this._running = true;
    }
    public function stop():Void
    {
        clearInterval(this._timerID);
        this._running = false;
    }
    public function toString():String
    {
        return "[AsBTimer]";
    }
    //----------------------------------------
    private function startTimer():Void
    {
        this._currentCount++;
        this.broadcastMessage("timer", this._currentCount);
        if (this._currentCount == this._repeatCount) {
            this.reset();
            this.broadcastMessage("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;
    }
    //----------------------------------------
}

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

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

import AS2.utils.AsBTimer;
//----------------------------------------
class AsBTimerExample
{
    //----------------------------------------
    public function AsBTimerExample()
    {
        var te:AsBTimer = new AsBTimer(1000, 5);
        te.addListener(this);
        te.start();
    }
    private function timer(currentCount:Number):Void
    {
        trace("timer: " + currentCount);
    }
    private function timerComplete():Void
    {
        trace("timerComplete: ");
    }
    //----------------------------------------
}

保存文档.

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

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

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

下一节讲:[5.使用 addEventListener 方法(EventDispatcher 类)]

[5.使用 addEventListener 方法(EventDispatcher 类)]


打瞌睡了吧? 貌似有口水流下来了.呵.本人文字表达能力不是很好(好像是没吃多少书).让大家见笑了.其实学编程
是比较闷的.不只是闷,还有很多很多,但既然选择了,这些就只是学习途中的坎,需要我们跨过去.就像是你选择走哪
条路一样,既然选择了,就必需是要走的.但这路不只是你一个人走,人多了就会有竞争,我们不能总走在别人后面.所
以需要加快脚步走在前面,让后面的人去追.但有时也会在不知不觉中走弯路,我一样也会,所以在本文中如果你看到
有不正确的,希望你能指正,谢谢.此文的目的是想让大家在这条路上能走快点.你很啰嗦呀....呵.题外话就说到这.
下面继续.

9 7 3 1 2 3 4 5 4 8 :

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

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