咳咳,你的loading做好了就不用担心什么跳转,如果无法跳转那么就是loading没有做的完成,loading的基本原理就是测试影片的下载字节数,下载字节数小于完整大小,继续停留在loading的页面,当字节数等于完整大小,跳转到某一帧并开始播放,这里的某一帧是你的动画开始的第一帧。
再举个简单的实例,世界上所有的loading大概都可以分为三个部分:
1 制造一个循环,用于更新数据。一般来说有两种方法,一种是做成二帧,在第二帧中用gotoAndPlay(1)命令产生循环。另一种是只做一帧,利用onEnterFrame命令产生循环。
2 利用getBytesTotal()与getBytesLoaded()命令获取文件数据。
3 以图形或动画的方式将第二步获取的数据表现出来(一般同时还以文本方式精确表示)
上面的说明,对一个会做LOADING的人来说是很清楚的,但不会做的看了大概还是不会(呵呵)所以下面我们一步一步来,做个简单的例子(不做文本显示数据了):
2、简单的例子(只有两步,相信你有这个耐性):
Ⅰ 打开你的动画,新建一个场景,并把它拖到最前面。
Ⅱ 在帧上加入以下的AS动作,即大功告成!
源代码:
stop ();
function dr ( nam , de , d , al ) {
na = createEmptyMovieClip ( nam , de );
na . lineStyle ( d , 0x9900cc , al );
na . _x = 160 ;
na . _y = 280 ;
na . lineTo ( 240 , 0 );
}
//一个画线条的函数,四个参数对应什么,自己看哈
onEnterFrame = function () {
var a = getBytesTotal ();
var b = getBytesLoaded ();
//取得下载的数据
if ( b < a ) {
dr ( "b1" , 0 , 30 , 30 );
dr ( "b2" , 1 , 20 , 30 );
dr ( "b3" , 2 , 20 , 100 );
b3 . _xscale = b / a * 100 ;
//画三条横线,显示下载进度;
} else {
delete onEnterFrame ;
b1 . removeMovieClip ();
b2 . removeMovieClip ();
b3 . removeMovieClip ();
play ();
//下载完毕,删除图形和函数;
}
};
可以按两次Ctrl+Enter进行下载测试,如果你对AS有恐惧症,闭着眼睛复制—粘贴即可
我也不是很懂,写些个人意见供参考。纯属交流。
针对你提出的缺陷,
1. 为了UI改动逻辑层是否值得。个人认为这要看你的业务逻辑层是否成熟,很明显,一个长时间运行的函数,没有任何事件接口供外部类使用是很不应该的。你可以看.net自己的类来对比一下。所以我认为是需要改动该处的。当然考虑到可能别的业务类已经在使用LongWork,而且基于面向对象开闭原则,建议你通过建立新业务类来封装LongWork及加入相关事件接口,或者通过子类继承,来重写LongWork方法,而不是直接改动。
2 有了上述的新业务类或者子类,那么UI层也就不再需要混入业务逻辑了。至于分解子步骤,如何向外部反馈进度,那该是新逻辑类该处理的问题。我只能说进度条更多意义在于让操作者知道在处理及尽可能让操作者能评估后续时间,而不是完全精确。