Flash as中有关IntervalManager, setInterval 扩展的的介绍
以下是我在学习Flash as中整理出来的关于IntervalManager, setInterval 扩展的介绍以及用法。
另见 IntervalCaster
如何使用
// 首先准备一下 array 的 prototype
Array.prototype.remove = function(index) {
if (index == 0){
this.shift();
} else if (index == (this.length - 1)){
this.pop();
} else if (index > 0 && index < (this.length - 1) ){
this.splice(index, 1);
}
}
_global.ASSetPropFlags(Array.prototype, "remove", 1, 0);
// 导入包
import MirageSystem.utils.IntervalManager;
function test1 (arg1, arg2) {
trace("scope : " + this);
trace("arguments.length : " + arguments.length);
for (var i in arguments) {
trace("arg[" + i + "] : " + arguments[i]);
}
}
// test2 是带返回值的例子
var test2ReturnValue:String;
function test2 () {
trace("我是 test2");
return "这里是 test2";
}
// test3 会被无限持续调用, 看看 test2ReturnValue 的改变吧
function test3 () {
trace("我是 test3, test2ReturnValue 的结果是 : " + test2ReturnValue);
}
function test4 () {
trace("我是 test4, 现在暂停 test3");
intervalMgr3.pause();
}
function test5 () {
trace("我是 test5, 恢复 test3");
intervalMgr3.start();
}
function test6 () {
trace("我是 test6, 释放所有 interval");
IntervalManager.cleanUp();
}
function intervalMgr1_invoke (e:Object) {
trace("intervalMgr1.currentCount : " + e.currentCount);
}
function intervalMgr1_stop (e:Object) {
trace("intervalMgr1 已停止");
}
// 设置一个 interval, 第 1 个例子还包括了如何设置侦听器
var intervalMgr1:IntervalManager = IntervalManager.run(test1, 1000, ["arg1", "arg2"], true, 3, this);
intervalMgr1.addEventListener(IntervalManager.INVOKE, intervalMgr1_invoke);
intervalMgr1.addEventListener(IntervalManager.STOP, intervalMgr1_stop);
var intervalMgr2:IntervalManager = IntervalManager.run(test2, 1500, null, false, 1, this, [this, "test2ReturnValue"]);
var intervalMgr3:IntervalManager = IntervalManager.run(test3, 100);
var intervalMgr4:IntervalManager = IntervalManager.run(test4, 800, null, null, 1);
var intervalMgr5:IntervalManager = IntervalManager.run(test5, 1300, null, null, 1);
var intervalMgr6:IntervalManager = IntervalManager.run(test6, 5000);
提示:您可以先修改部分代码再运行
下面是我的运行结果
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test4, 现在暂停 test3
intervalMgr1.currentCount : 2
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test5, 恢复 test3
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
intervalMgr1.currentCount : 3
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
intervalMgr1 已停止
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test6, 释放所有 interval
提示:您可以先修改部分代码再运行
IntervalManager.as
/**
* IntervalManager, 提供一组管理 interval 的功能
*
* @author kakera
* @version 1.0
*/
class MirageSystem.utils.IntervalManager extends MirageSystem.core.EventObject
{
//
// 一些状态常量
//
public static var RUNNING:Number = 0;
public static var STOPPED:Number = 1;
public static var PAUSED:Number = 2;
//
// interval 被 invoke 的事件
//
public static var INVOKE:String = "invoke";
public static var STOP:String = "stop";
//
// 存放所有 intervals
//
private static var intervals:Array = new Array();
//
// 用于保存变量, 这里为了优化输出 swf 的体积没有做相应的 getter / setter
//
public var id:Number;
public var func:Function;
public var interval:Number;
public var totalCount:Number;
public var scope:Object;
public var args:Array;
public var delay:Boolean;
public var returnVar:String;
public var returnScope:Object;
public var hasReturnValue:Boolean;
public var state:Number;
public var intervalId:Number;
public var currentCount:Number;
/**
* 设置一个新的 IntervalManager, 返回 IntervalManager 实例
*
* @usage
* @param func 要执行的函数
* @param interval 每次执行间隔
* @param args 可选, 传递的参数
* @param delay 可选, 确定首次执行的时间, 0 或者 interval 的时间
* @param count 可选, 运行的间隔
* @param scope 可选, 修改函数的执行范围, 起到 Delegate 的作用
* @param returnValue 可选, 指定存放返回值的变量, 该数组的第 1 个元素是变量的范围, 第 2 个元素是变量的名称 (字符串表示)
* @return
*/
public static function run (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array):IntervalManager {
var intervalMgr = new IntervalManager(func, interval, args, delay, count, scope, returnValue, intervals.length);
intervals.push(intervalMgr);
return intervalMgr;
}
/**
* 释放所有的 interval
*
* @usage
* @return
*/
public static function cleanUp ():Void {
for (var i in intervals)
intervals[i].release();
}
private function IntervalManager (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array, id:Number) {
//
// 错误检查, 如果觉得多余可以注释掉. 减少文件尺寸
//
if (id == undefined)
throw new Error("参数 id 不能为空");
//
// 根据 returnValue 参数确定该函数是否有返回值
//
if (returnValue instanceof Array) {
if (returnValue.length != 2) {
throw new Error("参数 returnValue 只能是长度为 2 的数组");
}
hasReturnValue = true;
} else {
hasReturnValue = false;
}
this.func = func;
this.interval = interval;
this.args = args;
this.delay = delay;
this.totalCount = count == undefined ? Infinity : count;
this.currentCount = 0;
this.scope = scope;
this.id = id;
this.returnScope = returnValue[0]
this.returnVar = returnValue[1];
start();
}
/**
* 开始 interval
*
* @usage
* @return
*/
public function start ():Void {
if (state != PAUSED) {
//
// 确定首次执行时间
//
if (delay)
invoke(func);
intervalId = setInterval(this, "invoke", interval, func);
}
setState(RUNNING);
}
/**
* 停止 Interval, 或者可以通过使用 release 来释放 IntervalManager 实例
*
* @usage
* @return
*/
public function stop ():Void {
//trace("stop()");
//
// 重置 currentCount 计数并清除 interval
//
dispatchEvent( {type : STOP, currentCount : currentCount, totalCount : totalCount} );
currentCount = 0;
clearInterval(intervalId);
intervalId = 0;
setState(STOPPED);
}
/**
* 暂停 interval, 如果已经在暂停中则会恢复 interval
*
* @usage
* @return
*/
public function pause ():Void {
if (state != PAUSED) {
setState(PAUSED);
} else {
this.start();
}
}
/**
* 提供释放 IntervalManager 的功能, 虽然我不知道这么干到底有没有用 -_-,
* 如果你觉得不需要可以改掉
*
* @usage
* @return
*/
public function release ():Void {
//trace("release()");
//
// 直接使用 stop() 是调用不到的 -0-
//
this.stop();
//
// 移除数组中关联的 IntervalManager 实例
//
intervals.remove(id);
//
// 如果上面的句子报错, 请注释掉上面的, 并取消注释下面这句
// intervals["remove"](id);
//
// 或者你可以通过为 Array 类增加一个方法 remove 来解决此问题
//
for (var i in this)
delete this[i];
}
/**
* 设置当前状态
*
* @usage
* @param state
* @return
*/
private function setState (state:Number):Void {
this.state = state;
}
/**
* 调用方法的方法
*
* @usage
* @param method 要调用的方法的引用
* @return
*/
private function invoke (method:Function):Void {
//
// 判断 count 是否继续循环, 否则释放循环
//
if (totalCount > currentCount) {
//
// 如果当前状态是暂停中就跳过
//
if (state != PAUSED) {
currentCount++;
//
// 广播 INVOKE 事件, 返回当前执行了的次数和总次数
//
dispatchEvent( {type : INVOKE, currentCount : currentCount, totalCount : totalCount} );
//
// 判断是否有是有返回值的调用
//
if (hasReturnValue) {
returnScope[returnVar] = method.apply(scope, args);
} else {
method.apply(scope, args);
}
}
if (totalCount <= currentCount) {
release();
}
} else {
release();
}
}
}
提示:您可以先修改部分代码再运行
EventObject.as
/**
* EventObject
*
* @author kakera
* @version 1.0
*/
class MirageSystem.core.EventObject
{
private var dispatchEvent:Function;
public var addEventListener:Function;
public var removeEventListener:Function;
private static var __MIX_IN__ = MirageSystem.event.EventDispatcher.initialize(EventObject.prototype);
public function EventObject () {
}
}
提示:您可以先修改部分代码再运行
EventDispatcher.as
就是 mx.event.EventDispatcher -_-
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |