目的是使用一个定时器,但是完成多个Function的功能,并且完成时调用不同的函数。不过个人感觉参数太多,而且如果程序执行时间之和大于延迟时间,不就产生混乱了吗?
有时有一些function都有延时,并且频率都一样,
一般的做法是 一个做法: 每个function都new Tiemr,
function不多还好,一旦多了就很浪费资源了,
这个时候,O(∩_∩)O哈哈~MutiTimer出场了
MutiTimer应用环境:
MutiTimer与Timer比较 之优点:
- 更高效:用一个Timer调用所有的function
- 传任意参数: Timer TimerComplete都可以传任意个数参数
- 更安全:使用者 不用事件,就不需要记住 移除事件
MutiTimer与Timer比较 之缺点:
- 多个function必须频率一致,是Timer.delay 一样,不然精确度低
- 不能记录执行了多少次
- 启动了一个function后,这个function将不能停下,直到 指定时间之后
说了这么多,放代码上来
package cn.lite3.utils { import flash.events.TimerEvent; import flash.utils.getTimer; import flash.utils.Timer; /** * <a href="http://www.lite3.cn">www.lite3.cn</a> * lite3@qq.com * @author lite3 */ public class MultiTimer { private var _delay:Number; private var queue:Array = []; // 对象池 private var timer:Timer; /** * 构造函数 * @param delay <b> int </b> Timer的间隔 单位:ms */ public function MultiTimer(delay:Number) { this.delay = delay; } /** 频率 */ public function get delay():Number { return _delay; } public function set delay(value:Number):void { if (isNaN(value)) value = 0; if (value < 0) value = 0; if (_delay != value) { _delay = value; if (timer) timer.delay = value; } } /** * 添加一个时间函数 * * @param time <b> int </b> 运行的时间,单位:ms * @param completeFunc<b> Function</b> 结束时函数 * @param completeArgs<b> Array </b> 结束时函数的参数 * @param completeThis<b> Object </b> 结束时函数的this对象 * @param timerFunc <b> Function</b> timer时函数 * @param timerArgs <b> Array </b> timer时函数的参数 * @param timerThis <b> Object </b> timer时函数的this 对象 */ public function addTimer(time:int,completeFunc:Function = null,completeArgs:Array = null,completeThis:Object=null,timerFunc:Function = null,timerArgs:Array = null,timerThis:Object = null):void { if (!completeFunc && !timerFunc) return; // 时间为0,则马上调用回调函数 if (time <= 0) { if (completeFunc) completeFunc.apply(completeThis,completeArgs); return; } // 添加事件到队里 var vo:Vo = new Vo( getTimer() + time,completeFunc,completeArgs,completeThis,timerFunc,timerArgs,timerThis); addToQueue(vo); // 惰性启动 if (!timer) timer = new Timer(_delay); // 运行timer if (!timer.running) { timer.addEventListener(TimerEvent.TIMER,timerHandler); timer.start(); } } /** * @private 添加一个事件到 有序队列(按time 从大到小排列) * @private * @param vo */ private function addToQueue(vo:Vo):void { var time:int = vo.time; var index:int = 0; for each(var tem:Vo in queue) { if (tem.time <= time) break; index++; } for (var i:int = queue.length; i > index; i--) { queue[i] = queue[i - 1]; } queue[index] = vo; } /** * @private 执行循环 * @param e */ private function timerHandler(e:TimerEvent):void { var currTime:int = getTimer(); for (var i:int = queue.length -1; i >= 0; i--) { var vo:Vo = queue[i] as Vo; // Timer 事件 if (vo.timerFunc) vo.timerFunc.apply(vo.timerThis,vo.timerArgs); // TimerComplete 事件 if (vo.time <= currTime) { queue.pop(); if (vo.completeFunc) vo.completeFunc.apply(vo.completeThis,vo.completeArgs); } } if (queue.length <= 0) { timer.stop(); timer.removeEventListener(TimerEvent.TIMER,timerHandler); } } } } // 存放 相关信息 class Vo { public var time:int public var completeFunc:Function; public var completeArgs:Array; public var completeThis:Object; public var timerFunc:Function; public var timerArgs:Array; public var timerThis:Object; public function Vo( time:int,completeFunc:Function,completeArgs:Array,completeThis:Object,timerFunc:Function,timerArgs:Array,timerThis:Object):void { this.time = time; this.completeFunc = completeFunc; this.completeArgs = completeArgs; this.completeThis = completeThis this.timerFunc = timerFunc; this.timerArgs = timerArgs; this.timerThis = timerThis; } }
MultiTimer 用法:
package { import cn.lite3.utils.MultiTimer; import flash.display.Sprite; import flash.utils.getTimer; /** * www.lite3.cn * lite3@qq.com * @author lite3 */ public class MultiTimerExample extends Sprite { private var beginTime:int; private var multiTimer:MultiTimer; public function MultiTimerExample() { beginTime = getTimer(); // 要先实例化才能用,参数为 精度,相当于 new Timer(t)的t 参数 multiTimer = new MultiTimer(100); /** * 添加一个事件,其实就是一个函数,这个函数会以回调的方式调用 * 支持 传入参数 */ multiTimer.addTimer(1000,completeHandler,["function1",1000],null,timerHandler,1000]); multiTimer.addTimer(2000,["function2",2000]); multiTimer.addTimer(3000,["function3",3000]); } private function timerHandler(name:String,time:int):void { trace("timerHandler!这是:",name,"/t持续时间:",time); } private function completeHandler(name:String,time:int):void { trace("completeHandler!这是:",time,"/t实际用时:",getTimer() -beginTime); if ("function3" == name) { time = getTimer(); // 不同的时间添加事件 multiTimer.addTimer(1000,["重启后的function3",1000]); } } } }
运行后,您会看到类似下面的输出
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
completeHandler!这是: function1 持续时间: 1000 实际用时: 1102
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
completeHandler!这是: function3 持续时间: 3000 实际用时: 3100
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
转载自:http://www.lite3.cn/