loadmovie 判断加载完成+Flash制作中常见的加载

2012-01-17 09:56  评论 0 条

1.写在前面
熬头次写这样有点像教程的东西,希望能对于大家有点帮助。帮助!呵呵~~,没帮助的快下个帮助去。
常常看到有些同学问这样的问题,为啥子我loadMovie近来的图片不能按照我的代码显示它的大小啊?为什loadVariables进来的变量用在as中没有值呀?内容来自中国站长资讯网(www.chellonahtml.com)为啥子我加载的swf文件的比例,位置和大小不能控制呀?
笔者(汗!这个词语感觉起来太专业了。)刚研究这个的时候也困惑了好长时间。
呵呵。后来终于悟到:程序的执行是很快很快的,而加载外部的不论什么东西都是需要时间的,只管有时候那时间只有一点点点点。
2。先说加载文本。
这部门可以用的函数有loadVariables,loadVariablesNum,还有就是loadVars类和XML类。至于它们的施用方法,flash自带的帮助讲的很全面很全面了,内容来自中国站长资讯网(www.chellonahtml.com)我就没必要这里在帖了。想要说的是,loadVariables,loadVariablesNum只是两个加载文本的函数,他们只是具有加载外部文本的能力,而没有不论什么事件处置惩罚,flash无法得知外部文本文件是否已经被加载完成,因此需要依靠onEnterFrame,setInterval等不断循环事件或者函数,来查抄变量是否存在,也可以用帧循环,才可以确定外部文件是否加载完成。
底下的代码没有达到想要的成效:
thellos.createEmptyMovieClip("mc",thellos.getNestHighest Depth());
mc.loadVariables("1.txt");
//loadVariablesNum("1.txt",1)将变量加载到特别指定级别
gotoAndStop(mc.frame);
//gotoAndPlay(_level1.frame);
//文本内容为frame=20
PS 加载出现乱码解决方法:文本另存为utf-8编码或者是在熬头帧加System.useCodepage=true;至于缘故原由,自己google吧。在这我一时也解释不清。
要实现上边想达到的跳转,可以在文本中增加一标记变量,比较底下的代码和上边的差别之处,
stop();
stop();
thellos.createEmptyMovieClip("mc", thellos.getNestHighestDepth());
mc.loadVariables("2.txt");
//loadVariablesNum("1.txt",1)将变量加载到特别指定级别_level
thellos.onEnterFrame = function() {
if (mc.end == undefined) {
looding.text = "加载中.....";
} else {
loading.text = "加载完成";
delete thellos.onEnterFrame;
gotoAndStop(mc.frame);
}
};
//文本内容为frame=20&end=ok
//这里用setInterval()做循环判断也行,帮助上边有具体做法。
这样做起来可能会觉得有点麻烦,我只是要加载我想加载的东西,怎么还要增加一个变量?那就用loadVars类吧!"LoadVars 类在 Flash Player 6 中引入的,为与 Web 服务器交换 CGI 数据的常见任务提供一个更清晰、更面向对于象的接口",它使得加载外部文本变的更加灵活。
用loadVars类创建一个对于象,施用onLoad,onData处置惩罚方法,都可以利便的达到判断加载完成的目的.而且loadVars对于象还有getBytesTotal()和getBytesLoaded()方法,更加能直接明了的反映出下载的情况,在帮助里面找loadVars.呵呵。XML类也是同样道理,只是加载成功后的处置惩罚方法差别。
System.useCodepage = true;
var my_lv = new LoadVars();
my_lv.onLoad = function(success) {
if (success) {
trace("loaded!");
} else {
trace("loading");
}
};
my_lv.load("1.txt");
loadVars也可以加载xml文件,它能把xml文件中的全部内容做为字符串输出。
System.useCodepage = true;
var my_lv = new LoadVars();
my_lv.onData = function(src) {
if (src == undefined) {
trace("loading...");
} else {
a_txt.text = src;
}
};
my_lv.load("a.xml");
3。再说加载图片和flash影片
这部门可以用的函数有loadMovie,loadMovieNum,然后就是MovieCipLoader类。加载到影片剪接的 SWF 文件或图像会继承该影片剪接的位置、旋转和缩放属性,所以可以用影片剪接的目标路径来定位加载的 SWF 文件。在这里我们把加载的MC叫做loader_mc,把被加载的MC叫做loaded_mc,当然loadMovieNum()用到的loader_mc就是_level了哦。
同前面的loadVariables和loadVariablesNum一样,loadMovie和loadMovieNum具备加载外部图象和影片的能力,而没有不论什么事件处置惩罚,flash无法得知外部图象和影片是否已经被加载完成,因此需要依靠onEnterFrame,setInterval等不断循环来查抄,才可以确定外部图象和影片是否加载完成。
这里说一下用前两个函数时怎么判断加载完成,先说loadMovie();
thellos.createEmptyMovieClip("loader_mc", thellos.getNextHighestDepth());
loader_mc.loadMovie("1001.jpg");
thellos.onEnterFrame = function() {
if (loader_mc.getBytesLoaded() == loader_mc.getBytesTotal()) {
loader_mc._width = 200;
loader_mc._height = 200;
delete thellos.onEnterFrame;
}
};
呵呵。上边的代码貌似能做到调整长和宽的成效,测试就会发现场景中一片空白,在if语句里面trace(loader_mc._width )输出为0,怎么会这样?我在研究的过程当中也困惑了半天呢,在这里面多谢网友神仔的提示,呵呵,底下说解决过程。
在onEnterFrame刚起头执行的刹时,loader_mc.getBytesLoaded()和loader_mc.getBytesTotal()的输出都为0,0==0当然为true,所以上边的delete thellos.onEnterFrame在起头就执行了。也就是说上边的代码相当于
thellos.createEmptyMovieClip("loader_mc", thellos.getNextHighestDepth());
loader_mc.loadMovie("1001.jpg");
loader_mc._width = 200;
loader_mc._height = 200;
具体缘故原由见最后申明,这里面有几种解决方法:
1。用loader_mc.getBytesLoaded() / loader_mc.getBytesTotal()==1来判断。由算术上的"0/不论什么不为0的数==0",flash中trace(0/0)输出为false,这样也就间接判断了loader_mc.getBytesTotal()是不是为0,避免了0==0的问题。
2。我们也可以直接增加一个loader_mc.getBytesLoaded()大于0的判断条件。施用if (loader_mc.getBytesLoaded() == loader_mc.getBytesTotal()&&(loader_mc.getBytesLoad ed()>0)来作用判断条件。
再说loadMovieNum(),这个函数是把图片或者是swf文件加载到_level上,也就是场景中,所以这个过程的loader_mc就是_level了。呵呵。解释一下_level,加载到 Flash Player 中的每个 SWF 文件都被分配一个级别。同一级别中只能存在一个swf,加载两个swf到一个级别,后者会覆盖前者。
/*
loadMovieNum("1001.jpg", 1);
_level1._width = 200;
_level1._height = 300;
//这样是不行的。
*/
loadMovieNum("1001.jpg", 1);
thellos.onEnterFrame = function() {
if (_level1.getBytesLoaded() == _level1.getBytesTotal()&&_level1.getBytesLoaded()>0 ) {
_level1._x=_level1._y=50;
_level1._width = 200;
_level1._height = 300;
delete thellos.onEnterFrame;
}
};
然后说flash MX 2004起头有的MovieClipLoader类,在说MovieClipLoader 之前,我们得先知道侦听器。侦听器是侦听事件的对于象,当我们触发某一个事件的时候,该事件就被侦听器所侦听见,然后,该事件就由侦听器的方法来处置惩罚,当然,在MovieClipLoader侦听器对于象中,已经提前写入处置惩罚事件的方法。这里写一个简略的例子:
thellos.createEmptyMovieClip("loader_mc", 1);
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
with (target_mc) {
_x = _y=20;
_width = _height=300;
}
};
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.addListener(mclListener);
mcl.loadClip("1001.jpg",loader_mc);
//加载swf用mcl.loadClip("a.swf",loader_mc);
关于MovieClipLoader类的用处的学习,可以去看看awflasher的原创-完美的loading-吐血整理!aw的语言表达能力和flash水平远强于我,呵呵。我就不这里多说了,相信有了帮助和aw的教程,你很快就能掌握这个类的用处。
最后,只要你到这里的时候你明白了底下的解释我就算成功了。哈~~。加载外部文本,变量,图像或者是swf的时候,内容来自中国站长资讯网(www.chellonahtml.com)flash需要建立一个新的对于象,有时候是创建一个新的来替换前面的,有的是新建一个对于象,无论何种情况,都会导致程序的推迟,也就是不能马上天生这样的一个对于象。代码的是从上到下顺序执行,一帧上的代码只能顺序执行一次,所以只有让它循环执行一下,才有时间判断加载的完成。简略的像这样
loader_mc.loadMovie("1001.jpg");
trace(loader_mc._width);//这时候输出的一定是加载前的loader_mc 的宽
,可以知道trace()执行的时候这样一个对于象还没有创建成功,也就是还没有得到要加载的MC或者图片的属性。所以这时执行loader_mc._width=300;loader_mc._height=400;是没有意义的。同样加载变量也是同样道理。
最后,想要说的是,加载文本推荐用loadVars类,加载图像或者是swf推荐用MovieClipLoader。

很多人出现flash加载外部图片而不能控制显示大小的问题,导致这样问题的原因其实是因为flash在加载图片是采用渐进式的方式,在图片没有加载完成的时候,flash是不知道你的图片的大小的和尺寸的属性的。所以你在程序中即时加入控制大小的代码也无法控制图片。因为代码往往在图片还没有加载完之前就执行了,也就是说你的代码是找不到执行的对象的。所以使用_width和_height代码是无效的。而_xscale和_yscale可以执行但是因为是按照百分比计算的,所以也不能控制不同大小的图片最后显示同样大小的尺寸。

解决办法:

loadClip代码,我想你应该也是知道的, loadClip代码就是解决这个问题的最佳人选了。loadMovie属于初级代码,它没有侦听器这样的属性,因此无法捕捉到文件的属性(大小,尺寸)。因此我们不推荐使用这个代码,如果你的flash只是用于本机播放的,不存在网络延迟那么也就无所谓的了,但是如果你要控制加载图片的大小,那么还是需要用loadClip即时你的flash是本地播放的,因为即时加载本地的图片,加载图片的时间肯定也是滞后于代码执行的,因此我们选用loadClip代码,作为加载外部文件的最佳代码。
我们看以下它侦听器的各项属性:(我这里就讲一个了)
onLoadInit
属性是用于检测文件状态属性的
这个属性非常的重要,因为它能告诉你图片的各项属性,也就是只有这个时候你才能知道文件的尺寸大小。你可以试一下trace(MC._width)是不是就是图片的大小。如果是,就证明图片已经加载完毕,并且你可以通过程序去控制它的大小了。
onLoadInit= function(target_mc:MovieClip){
target_mc._width=100;
target_mc._height=100;
}
看看是不是加载近来的图片就是100像素*100像素的显示了,你可以通过程序自由控制加载近来的图片大小了。

延伸代码,如何让你的图片可以宽是100像素而高是等比缩放的呢?
onLoadInit = function(target_mc:MovieClip){
target_mc._height=(100*target_mc._height)/target_mc._width;
target_mc._width=100;
}
target_mc._height=(100*target_mc._height)/target_mc._width;
放在上面很重要的哦,千万不要这样放:
target_mc._width=100;
target_mc._height=(100*target_mc._height)/target_mc._width;
这样你的高肯定不是等比率的。

通过以上讲解是不是可以啦!

参考flash帮助文档,我弄了个简单的实验效果,大家可以直接复制粘贴

this.createEmptyMovieClip("image_mc", this.getNextHighestDepth());
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
target_mc._width = 100;
target_mc._height = 100
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("1.jpg", image_mc);

可以测试代码效果

历史上的今天:

本文地址:http://blog.zd178.com/?p=437
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
新年快乐
新年快乐

发表评论


表情