Browse > Home > Archive: 一月 2007

| Subcribe via RSS

深入了解setInterval方法

一月 20th, 2007 | No Comments , 175 views | Posted by flashlizi in Flash CS3/AS3

相信大家对setInterval方法肯定非常熟悉,但不少人对其缺乏深入的了解,致使当一个flash里有多个setInterval的时候就容易混淆,该清除的间隔ID没有清除,不该清除的时候却清除了。对于setInterval的语法我就不赘述,很多文章都有详细说明,下面来说一下setInterval的几个重点。

1、setInterval和clearInterval都是全局函数,也就是_global.setInterval()和_global.clearInterval()。
这一点大家应该都知道,但是可能并没有特别注意。不过这点对我们理解他们非常重要。setInterval的返回值是一个间隔ID(数字),所以这个间隔ID也是全局的。
比如下面的代码:
[code]var rootID=setInterval(_root, "test", 500, "rootID");
function test(arg) {
trace(arg);
}[/code]
我们用clearInterval(rootID)和用clearInterval(1)的作用是一样的。

2、每一次调用setInterval,就会返回一个间隔ID,这个ID数值为全局setInterval的调用次数。
比如下面的代码:
[code]var rootID=setInterval(_root, "test", 500, "rootID");
btn1.onPress=function(){
setInterval(_root, "test", 500, "btn1_ID");
}
btn2.onPress=function(){
setInterval(_root, "test", 500, "btn2_ID");
}
function test(arg) {
trace(arg);
}[/code]
在这个例子里,我们可以用clearInterval(1)来清除间隔rootID。假如我们先点击btn1再点击btn2,那么就可以用clearInterval(2)来清除点击btn1所产生的间隔ID,而用clearInterval(3)来清除点击btn2所产生的间隔ID。相反,如果我们先是点击btn2再点击btn1,那么clearInterval(2)则是清除点击btn2所产生的间隔ID.

3、给间隔ID添加标识符
在实际编程中,用上面的clearInterval(数字)这样的方式固然可以清除间隔ID,但是一旦ID过多,我们就会无法识别该清除哪个ID。因此给间隔ID添加标识符就显得非常重要。但是必须把他分配到一个对象的成员变量中。
比如下面的代码:
[code]newtest();
function newtest(){
var newID=setInterval(_root, "test", 500, "btn2_ID");
}
function test(arg) {
trace(arg);
}[/code]
这样的标识方法就是错误的,因为testID是一个局部变量,仅作用于new方法内。因而无法在其他地方用clearInterval(newID)来清除此间隔。而去掉前面的var就可以了(此时newID是_root的一个成员变量)。

4、增加一个清除loadMovieNum加载进来swf的间隔ID的例子:
在IntervalID2.swf文件里的有个间隔ID:
[code]var IntervalID2=setInterval(_root, "test", 1000, "IntervalID2");
function test(arg) {
trace(arg);
}[/code]
在IntervalID1.swf里:
[code]loadMovieNum("IntervalID2.swf",1)
btn1.onPress = function() {
clearInterval(_level1.IntervalID2)
IntervalID1=setInterval(_root, "test", 2000, "IntervalID1");
};
btn2.onPress = function() {
clearInterval(2)
//clearInterval(IntervalID1)
};
function test(arg) {
trace(arg);
}[/code]
在此例中,如果我们先点击btn1再点击btn2,那么2个间隔ID都会删除,而如果先点击btn2,那么IntervalID1是没有清除的。明白上面三点后,这些应该就是显而易见的了。

总结:了解了上面几个重点后,我想使用setInterval方法就会一清二白了,不会怕setInterval了而clearInterval不了的情况了。如有错误,敬请指正。

解决Form中ExternalInterface的Bug问题

一月 20th, 2007 | No Comments , 235 views | Posted by flashlizi in Flash8/AS2

ExternalInterface API是专门处理flash与外部应用的交互的。在IE浏览器下,将flash对象放在form标签之间的时候,js就会报错,ExternalInterface的call和addcallback方法失效。网上有2种解决办法,经测试均有效。

1、加一个

在你嵌套flash的form里的

标记后面:
[code]<form><form></form>
//这里是你的flash代码内容。
</form>[/code]
这算是一个小hack吧。

2、添加如下JS在你的flash之前:
[code]<script type="text/javascript">
function ExternalInterfaceManager()
{
this.registerMovie = function(movieName) {
if(!window.fakeMovies) window.fakeMovies = new Array();
window.fakeMovies[window.fakeMovies.length] = movieName;
}
this.initialize = function() {
if(document.all)
{
if(window.fakeMovies)
{
for(i=0;i<window.fakeMovies.length;i++)
{
window[window.fakeMovies[i]] = new Object();
}
window.onload = initializeExternalInterface;
}
}

}
}
function initializeExternalInterface() {
for(i=0;i<window.fakeMovies.length;i++) {
var movieName = window.fakeMovies[i];
var fakeMovie = window[movieName];
var realMovie = document.getElementById(movieName);

for(var method in fakeMovie) {
realMovie[method] = function() {flashFunction = " + method.toString() + "\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments, 0) + "";this.CallFunction(flashFunction);}
}

window[movieName] = realMovie;
}
}
var eim = new ExternalInterfaceManager();
eim.registerMovie("flash_id");
eim.initialize();
</script>[/code]
其中eim.registerMovie("flash_id"); 中的flash_id为你的swf的ID。

AS2类:颜色属性ColorProperty(饱和度对比度等)

一月 20th, 2007 | No Comments , 276 views | Posted by flashlizi in Flash8/AS2

用AS来调整图片的色相、亮度、灰度、饱和度、对比度、反相虽然不难,但因为涉及到ColorMatrixFilter的颜色矩阵的应用,使用起来有点麻烦,因此写了这个类ColorProperty。
这个类是对MovieClip类扩展,为MovieClip增加了这些属性:色相:_hue,亮度:_brightness,灰度:_grayscale,饱和度:_saturation,对比度:_contrast,反相:_invert。
当然,你也可以改写这个类,使之成为一个新类,而不是扩展MovieClip类。

用法(与_width,_height用法一样):
import ColorProperty;
ColorProperty.init();
//色相,取值范围为:-180~180
//img._hue=100;
//trace(img._hue);
//亮度,取值范围为:-255~255
img._brightness = 100;
//trace(img._brightness)
//灰度,布尔值,true为灰度,false则反之。
//img._grayscale = true;
//trace(img._grayscale);
//饱和度,一般范围为:0~3为宜
//img._saturation = 3;
//trace(img._saturation);
//对比度,取值范围为:0~1
//img._contrast = 0.15;
//反相,布尔值,true为反相,false则反之。
//trace(img._contrast);
//img._invert=true;

附上源文件和演示:点击下载ColorProperty

一组非常好的讲解Matrix应用的文章

一月 19th, 2007 | No Comments , 277 views | Posted by flashlizi in Flash8/AS2

矩阵转换在变形、颜色调整、滤镜等方面有非常重要的应用。下面是一组这方面非常好的英文教程:
1、利用Matrix在Flash中做几何变换,调整颜色和卷积特效http://www.adobe.com/devnet/flash/articles/matrix_transformations_print.html
2、理解Flash8中的矩阵变换
http://www.senocular.com/flash/tutorials/transformmatrix/
3、颜色矩阵类(ColorMatrix Class)http://www.gskinner.com/blog/archives/2005/09/flash_8_source.html
4、回旋矩阵(Convolution Matrix)
http://docs.gimp.org/en/plug-in-convmatrix.html