打印

[应用] flash全站如何共用一个loading,要详细的过程

我的方法是把loading复制到要加载的swf文件中,谁知道调用过来的flash一加载就在那里循环,好像子文件的loading也控制了main文件的播放,不知道是不是路径的问题

TOP

没有能解答吗,期待中

TOP

我的办法是:
把loading.swf作为一个Loading文件。

然后每个影片中新建一个影片剪辑:loading

实例名称为:loading

然后在AS层上写上:
loading.loadMovie("swf/loading.swf");
loading._x = 0;
loading._y = 0;
05idea.com

TOP

可是加载的时候出现死循环了,一直在那里不断的加载进度条,加载完之后重新又加载一遍,就这样不停的在循环,如果不加载子flash的话没有问题,一旦加载子flash就好像子flash控制了主flash一样,请问这是怎么回事

TOP

子文件的loading也控制了main文件的播放?

呵呵。如果只是因为这一个问题那可以解决。偶的镇机之宝之11(其实是以前在朱高的博客上面学到的 ):
引用:
11、MC加载外部影片时需要注意的问题
在主场景中新建一个空的 MC,把外部影片导入到这个 MC 里,例如这个 MC 名字为 testMC,载入的代码为:testMC.loadMovie("外部影片");

原则上,此时,这个外部 SWF 里的代码要根据主场景来修改,就是说这个外部 SWF 相当于已经是主场景中的一个元件“testMC”,如果这个外部 SWF 中有 _root ,那么:

原来的代码:_root.....
要改成类似:_root.testMC.....
还有一种方法就是改成相对路径,用 _parent 来实现。

但是这些都较为烦琐,事实上,我们只需在“testMC”的第一帧写上“this._lockroot=true;”就行了。也可以写在“testMC”的外部,写法类似这样:“testMC._lockroot=true;”它将确保外部影片在被加载之后,其 _root 仍然指向其本身,而不会受加载后主影片的影响。

TOP

你要省事的话,,做LOADING时,多建一个场景就OK了...然后就可以共用了!

TOP

使用 MovieClipLoader 侦听加载进度即可
我做的时候一般是会主场景里建一个进度条, 比如叫 loadProgressBar;和一个用于加载模块的容器, 比如:container.
再定义一个全局方法加载模块. 要加载新模块时调用这个方法就可以了.

这个方法会创建一个 MovieClipLoader 监听加载进度, 开始加载后显示 loadProgressBar 并隐藏 container, 加载结束 隐藏 loadProgressBar 显示 container.
*UP*
http://www.mk-pig.com/cworld/

TOP

按照五楼的方法是可以解决了,但是加载的时候用的三楼的方法,出现了主场景有加载进度条,加载的子swf文件没有出现加载进度条,请问这两个该如何结合

TOP

可同时设多个loader,循环计算所有loader的下载百分比,把所有的swf全部都Load到缓存里再重新用load入
水星

TOP

做一个单独的mc.用_parent 来实现.
我的小站.
http://www.natty84.cn

TOP

喜欢五楼讲的方法!只是自己其它楼主讲的看不懂,也不会用.学习中.

TOP

楼主问的是全站怎么共用一个loading.
5#这位兄弟回答的好像跟这个关系不大吧.如果用上this._lockroot=true的话.可以说被加载的swf和主flash是两个文件,怎么用他显示别的loading?
我的小站.
http://www.natty84.cn

TOP

饿 不太明白

TOP

我的做法是把loading MC放在主场景中比如index.swf,然后被调用的swf再attachMovie主场景中的这个loading MC,当然_lockroot是必须的。
you will never know what you can do till you try

TOP

我的做法是在场景上建立一个空的MC,取名为loadswf //将外部MC加载到这个空MC上
再建立多一个空MC,取名为mainmc
在mainmc的第二帧放loading的动画MC,命名为loader,在loader里添加一个动态文本,变量为loaded2
在mainmc的时间轴上第一帧加入stop();让其停止
在mainmc的时间轴上第二帧添加动作   
unloadMovie("_root.loadswf");   //卸载当前的影片
loadMovie(url, "_root.loadswf"); //把外部影片加载到loadswf中
onEnterFrame = function ()   //加载到loadswf的loading
{
    var x1 = _root.loadswf.getBytesLoaded();
    var x2 = _root.loadswf.getBytesTotal();
    loader.loaded2 = Math.round(x1 / x2 * 100);
    if (x1 > 0 && x1 >= x2)
    {
        play ();
        delete onEnterFrame;
    } // end if
};
stop ();

在mainmc的时间轴第三帧添加动作  //加载完成,淡出loading效果
stop ();
loader.onEnterFrame = function ()
{
    if (loader._alpha <= 1)
    {
        play ();
        delete loader.onEnterFrame;
    }
    else
    {
        loader._alpha = loader._alpha - (loader._alpha - 1) / 10;
    }
};
在第四帧添加动作 //开始播放加载到loadswf的影片
_root.loadswf.play();
gotoAndStop(1);

在按键中添加动作

on (release)
{
    _root.mainmc.url = "swf/special.swf";   //定义加载外部swf的路径给mainmc
    gotoAndStop(2);
    _root.loadswf.play();
}

TOP

写一个LOADING类直接用就是了

TOP

这的确是个问题

TOP

引用:
原帖由 lzyy 于 2008-4-16 17:54 发表
我的做法是把loading MC放在主场景中比如index.swf,然后被调用的swf再attachMovie主场景中的这个loading MC,当然_lockroot是必须的。
常用这个

TOP

15#不错,值得学习下,加+5~
| ②00⑧ 記憶中的vIp

TOP

楼上的,没有漱口就跑起来了啊
just do it

TOP

。。为什么。。。为什么一定要把简单的问题复杂化呢?????

什么叫做公用一个loading呢?公用一个mc???那用就是了。。。如果你不介意主loading和页loading没有外观区别的话。。。。loading所有页面数据?????更不理解。。

分页的loading 建议还是在主swf里用loader来监测进度。。。这样便于控制动画协调。。比如控制位置。。帧的切换等等。。如果用loadmovienum就需要用onenterframe控制level几的位置。。换帧的时候还要unload比较麻烦。。被加载影片里。我的建议是尽量少用全局函数。。。一个帧里就用普通常数来标志东西就好了。。需要用的时候用相对路径。。。。而且3里已经取消了全局变量这个东西。。。。早点习惯一下吧。。

TOP

早看到你这个帖子里,不过前不久的项目遇到这个问题,这里吧自己的方法共享出来,大家学习一下!

测试地址:
http://www.mococo.cn/test/loading_example.swf

制作讲解:
首先做一个loading 类,包含三个方法,install,refresh,remove
复制内容到剪贴板
代码:
/*
*
* Autor: Martin.Mao
* Email/MSN: im@mococo.cn
* QQ: 183654371
*
*/
import flash.filters.BlurFilter;
import mx.behaviors.DepthControl;
import mx.transitions.Tween;
import mx.transitions.easing.*;

class cn.mococo.utils.loading {
    
    static var __loadingMC:MovieClip;
    
    /*
     * @ install(x:Number, y:Number):Void
     * @ 添加loading到舞台,坐标为x:Number, y:Number
     */
    static function install(x:Number, y:Number):Void {
        if ( !__loadingMC._visible ){
        //if ( !_level0.myloading._visible ){
            //将loading动画添加到场景
            __loadingMC = _level0.attachMovie('loadding_mc', 'myloading', _level0.getNextHighestDepth(), { } );
        }else {
            __loadingMC._visible = !__loadingMC._visible;
        }
        __loadingMC._x = x;
        __loadingMC._y = y;
        //初始化进度文字
        __loadingMC.per.text = '0% loaded';
        //初始化进度条
        __loadingMC.rateMC._xscale = 0;
    }
    
    /*
     * @ reFresh(num:Number):Void
     * @ 更新进度条及进度数字
     */
    static function refresh(num:Number):Void {
        //修改百分比数字
        DepthControl.bringToFront(__loadingMC);
        __loadingMC.per.text = num + '% loaded';
        //修改进度条
        //trace(__loadingMC.rateMC._width);
        trace(__loadingMC.rateMC._xscale);
        __loadingMC.rateMC._xscale = num;
    }
    
    /*
     * @ remove():Void
     * @ 卸载loading
     */
    static function remove(method:String, direc:String, speed:Number):Void {
        trace('method  :  ' + method);
        if ( method == 'Elastic' ) {
            var lY = __loadingMC._y;
            var lX = __loadingMC._x;
            if ( direc == 'left' ) {
                var del_loading:Tween = new Tween(__loadingMC, '_x', Elastic.easeIn, lX, lX - Stage.width * 2, speed, true);
            }else if ( direc == 'right' ) {
                var del_loading:Tween = new Tween(__loadingMC, '_x', Elastic.easeIn, lX, lX + Stage.width, speed, true);
            }else if ( direc == 'top' ) {
                var del_loading:Tween = new Tween(__loadingMC, '_y', Elastic.easeIn, lY , lY - Stage.height, speed, true);
            }else if ( direc == 'bottom' ) {
                var del_loading:Tween = new Tween(__loadingMC, '_y', Elastic.easeIn, lY , lY  + Stage.height, speed, true);
            }
        }else if ( method == 'Strong' ){
            var txt_blur:BlurFilter = new BlurFilter(0, 0, 0);
            __loadingMC.per.filters = [txt_blur];
            var del_loading:Tween = new Tween(__loadingMC, '_alpha', Strong.easeInOut, 100, 0, speed, true);
            var del_loading_per:Tween = new Tween(__loadingMC.per, '_alpha', Strong.easeOut, 100, 0, speed, true);
        }
        
        del_loading.onMotionFinished = function() {
            __loadingMC._visible = false;
        }
    }
    
}
在flash文件中自己要做一个共用的 loading 叫 loadding_mc,做好滚动条和加载百分比文本框,分别叫 'rateMC' 和 'per', 和上面class中对应;
在flash中使用时,先导入类 ==> 然后安装我们统一使用的loading(设置坐标) ==> 然后在加载过程中refresh(数字)百分比 ==> 加载完成remove();
在remove中按照参数的组合有多种来 disappear;大家可以看到 remove(method:String, direc:String, speed:Number);
使用如下方法:
复制内容到剪贴板
代码:
loading.remove("Elastic", "left", 2);       // loading向左回弹,消失,速度为2

loading.remove("Elastic", "right", 2);      // loading向右回弹,消失,速度为2

loading.remove("Elastic", "top", 2);        // loading向上回弹,消失,速度为2

loading.remove("Elastic", "bottom", 2);     // loading向下回弹,消失,速度为2

loading.remove("Strong", "", 2);            // loading透明度逐渐转为0,消失,速度为2
我们做个比方,在舞台上有一个叫 img_mc 的空剪辑要加载一个图片或者一个flash,加载前或加载开始install共用loading动画,加载完毕卸载loadiing;
复制内容到剪贴板
代码:
import cn.mococo.utils.loading;
//建立容器my_img_mc,设置好位置
var img_mc:MovieClip = this.createEmptyMovieClip("my_img_mc", this.getNextHighestDepth());
img_mc._x = 10;
img_mc._y = 10;
//安装 loading
loading.install(50,50);
var loader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
listener.onLoadProgress = function(target_mc:MovieClip, numBytesLoaded:Number, numBytesTotal:Number):Void {
    var pctLoaded:Number = Math.ceil(100 * (numBytesLoaded / numBytesTotal));
    loading.refresh(pctLoaded);
}
//加载成功后移除loading;
listener.onLoadComplete = function(){
    loading.remove("Elastic", "right", 2);
    //loading.remove("Strong", "", 2);
}
loader.addListener(listener);
loader.loadClip("http://www.mococo.cn/20080412%20Laser%20CS/images/P4120020.jpg", img_mc);
总结:
每当要使用loading时,先install,加载时refresh,加载完成remove,你看明白了吗?

[ 本帖最后由 mococo 于 2008-4-29 20:51 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

用as3吧 实现起来很简单 用工厂方法就好

用as3吧 实现起来很简单 用工厂方法就好
具体的你可以看这个
http://bbs.blueidea.com/thread-2852727-1-2.html

你可以在任何位置调用 他都会在程序域中用唯一一个队列下载

TOP

用_global定义全局函数行不.

TOP

function loadswf(x,y,path,name,depth){          
this.createEmptyMovieClip(name,depth);
this.createEmptyMovieClip(containerText,depth+1);
this[name].loadMovie(path);  

   var movie=this[name];
    var prelText=this[containerText];
       this[containerText]._x=x;
    this[containerText]._y=y;
    var formtext=new TextFormat();
    formtext.color="0x000000";
    formtext.font="_sans";
    formtext.align="center";
    prelText.createTextField("loadtext",50,5,5,80,20);
    prelText.loadtext.border=false;
    prelText.onEnterFrame=function() {
       if(this.percent!=100) {
          this.percent=int((movie.getBytesLoaded()/movie.getBytesTotal())*100)
          this.loadtext.text="Loading "+this.percent+"%";
          this.loadtext.setTextFormat(formtext);         
       }
       if(this.percent==100) {
          delete this.onEnterFrame;
          this.removeMovieClip();              
                }              
    }
}

把这段代码存为loading.as
然后在要加载的地方引用  函数  loadswf(x,y,path,name,depth)
x和Y就是坐标,PATH就是要加载的FLASH路径,NAME就是把FLASH加载到这个新的MC中,
DEPTH就是深度
如果一个FLASH要加多个FLASH的话,那NAME和DEPTH不能一样哦
比如:loadswf(50,80,mm.swf,mm123,2);
design888

TOP

收藏了,讨论得不错!

TOP