动画师也可以学会的FLA拆分加载(附loading条制作)
最近有人遇到代码子元件代码不运行或者不更新的bug,我这里提前先讲一下:

只保存子文件不够的,需要保存子元件的同时,把子文件的js复制进父文件的libs里面覆盖,才会更改。
还有一种办法:
就是删除(记着要先删除),然后重新导入新的文件,并增加版本号(为了避开缓存)

==================================================================
animateCC随着版本的迭代,功能越来越强了,对动画师也越来越友好了,很多时候不需要程序员也可以做很不错的H5页面,那么现今版本动画师对animateCC还有什么问题呢?可能大多数动画师感觉到了导出时间问题,好不容易做了一个很长的动画结果导出要半天,还会卡死。怎么办呢?简单,分割fla,然后用一个根fla加载,类似于过去flash的做法,那么我这里简单的讲解一下:
1.我们先弄2个资源fla,一个叫mc1一个叫mc2,但是注意fla设置成下图的样子,原因图里写了:

2.新建第三个fla叫mc3,然后F9打开动作,选择全局=》包含=》点击+号,导入mc1和mc2的js文件:

3.打开刚才mc1和mc2的html复制部分代码:

4.粘在舞台的第一帧,并进行部分合并和修改:

代码(如果是前端同学,可以吧代码放进js里,道理是一样的):
var lib1,lib2;//这里有几个要导出的fla就写几个变量,记得在handleComplete里赋值
var _this = this;//老生常谈,js的function里的this指向和as3不一样,所以要先保存this指向
var loaded = 0,loadTotal = 2;//已加载的文件和总共需要加载的文件,如果fla增加了这里也要改
var loadingBar;
function initLoadingBar(){//初始化loading条
loadingBar = new lib.loadingBar();
loadingBar.x = 100;
loadingBar.y = 100;
_this.addChild(loadingBar);
}
function init1() {
var comp=AdobeAn.getComposition("EBDD848CF4C3C342957F97F1FC74AF5B");
var lib=comp.getLibrary();
var loader = new createjs.LoadQueue(false);
loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
loader.addEventListener("progress", function(evt){handlerProgress(evt,comp)});
loader.addEventListener("complete", function(evt){handleComplete(evt,comp,"1")});//添加了类型做区分,我这里用了简单的数字,大家可以自行修改
var lib=comp.getLibrary();//一次lib也是可以的,但是adobe默认用了2个,我这里就抄过来了,可能是有什么操作会导致lib改变
loader.loadManifest(lib.properties.manifest);
}
function init2() {
var comp=AdobeAn.getComposition("F94842B164DDDF47B52EF60BAE97F9A5");
var lib=comp.getLibrary();
var loader = new createjs.LoadQueue(false);
loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
loader.addEventListener("progress", function(evt){handlerProgress(evt,comp)});
loader.addEventListener("complete", function(evt){handleComplete(evt,comp,"2")});//添加了类型做区分,我这里用了简单的数字,大家可以自行修改
var lib=comp.getLibrary();//一次lib也是可以的,但是adobe默认用了2个,我这里就抄过来了,可能是有什么操作会导致lib改变
loader.loadManifest(lib.properties.manifest);
}
function handleFileLoad(evt, comp) {
var images=comp.getImages();
if (evt && (evt.item.type == "image")) { images[evt.item.id] = evt.result; }
}
function handlerProgress(evt,comp){//进度条an默认不导出,需要自己写
var progress = Math.floor(loaded/loadTotal*100 + evt.progress * 100/loadTotal)
console.log(progress,"loaded");
loadingBar.gotoAndStop(progress,"+++",loaded);
//event.evt * 100
}
function handleComplete(evt,comp,type) {
loaded ++;
var lib=comp.getLibrary();
var ss=comp.getSpriteSheet();
var queue = evt.target;
var ssMetadata = lib.ssMetadata;
for(i=0; i<ssMetadata.length; i++) {
ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
}
if(type == "1")//根据上面的类型做区分,我这里1就表示第一个fla加载完成后
{
lib1 = lib;
init2();
}
else if(type == "2")
{
lib2 = lib;
allCompelteHandler();//所有的元件代码必须写在这个方法里面,不然会没有资源
}
}
function allCompelteHandler()
{
if(loadingBar.parent) loadingBar.parent.removeChild(loadingBar);//全部加载完成后需要把loading条删掉
var mc1 = new lib1.mc1();
var mc2 = new lib2.child2();
mc2.y = 200;
var mc3 = new lib2.child3();
mc3.y = 400;
_this.addChild(mc1,mc2,mc3);
}
initLoadingBar();
init1();//第一个fla需要直接调用,之后的在加载完后调用
注释我已经写在代码里了,还不懂就回复或者私聊我吧。
这里说一下loading条的制作,loading只要你做一个100帧的影片剪辑即可,然后你就按照我代码里的算法用加载进度跳帧就可以了。
5.发布fla,ctrl+enter就可以看到效果。
最后,附demo下载地址,注意看里面的fla结构
链接:https://pan.baidu.com/s/1t4PrAj6ZeTtaDpLX26AuQQ
提取码:ajex

匿名
会提高加载速度吗?
ajex
@匿名 比默认设置快,如果还需要加快,需要额外优化。