如果我在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使用技巧一文!
一、可以在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使用技巧一文!
回复Comments
作者:
{commentrecontent}