Browse > Home > Archive: 01月 2007

| Subcribe via RSS

深入了解setInterval方法

01月 20th, 2007 | No Comments , 113 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问题

01月 20th, 2007 | No Comments , 174 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(饱和度对比度等)

01月 20th, 2007 | No Comments , 197 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应用的文章

01月 19th, 2007 | No Comments , 219 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

wow gold wow gold wow gold wow power leveling wow power leveling wow power leveling nike shoes nike shoes nike shoes nike shoes jordan shoes Jordan shoes jordan shoes Jordan shoes world of warcraft gold world of warcraft gold Replica handbags 1