2004/11/09 | 定时器的编写-事件源,事件,委派与相关模式简析
类别(AS3) | 评论(3) | 阅读(849) | 发表于 14:32
如果我在FLASH中用脚本打开麦克风,想实时显示麦克风的音量,怎么做呢?
一、可以在onEnterFrame事件中刷新activityLevel麦克风的音量,但是这样做,一旦影片的帧数或大或小,刷新效果不是很好。
二、使用setInterval这个定时函数来刷新activityLevel麦克风的音量,但是这样做,如果在其他需要定时器的地方无法重用,因为setInterval函数依赖于刷新activityLevel麦克风的音量方法。
三、如果我写一个定时器类,每隔一段时间通知来刷新activityLevel麦克风的音量,这样定时器也可以在需要它的其他的地方工作,因为它不依赖于任何具体的逻辑。
下面是源代码:
/**
ActionScript Class File -- Created with SAPIEN Technologies PrimalScript 3.1

@class 定时器控制类
@package lm.utils
@author yunkai
@codehint 请使用addEventListener来响应onTimer事件
@example var t=new LTimer(80);
t.addEventListener("onTimer",Deletgate(this,onTimer));
@version 041109
*/

import mx.events.EventDispatcher;
import mx.utils.Delegate;

class lm.utils.LTimer {
    
    //定时器索引
    private var _id:Number;
    //相隔多少时间触发一次事件广播
    private var _time:Number;
    //委派引用
    private var _publishMsg:Function;
    
    //使用LEventDipatcher所需要定义的三个函数
    private var dispatchEvent:Function;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    /**
    * @description 构造函数
    * @param time 相隔多少时间触发一次事件广播
    */
    public function LTimer(time:Number){
        this._time=time;
        this._publishMsg=Delegate.create(this,publishMsg);
        LEventDispatcher.initialize(this);
    }
    /**
    * @description 启动定时器
    */
    public function startTimer(){
        this._id=setInterval(this._publishMsg,this._time);
    }
    /**
    * @description 结束定时器
    */
    public function endTimer():Void{
        clearInterval(this._id);
    }
    /**
    * @description 定时广播onTimer事件
    */
    public function publishMsg(){
        this.dispatchEvent({type:"onTimer",target:this});
    }
}

事件源就是定时器类,事件就是onTimer,委派在定时器内部使用了一处,在使用定时器也使用了一处,定时器内部使用委派是想将publishMsg的函数的this路径指向LTimer类的this,方便于扩展这个定时器,外面的委派使用可以参见我的BLOG关于Delegate使用技巧一文!
0

评论Comments

日志分类
首页[33]
AS3[20]
工作日记[10]
个人简介[2]
ASV[1]