allora, come preannunciato... ho sviluppato il codice con entrata e uscita e ho integrato la "zona preload"
codice:
var slideShow:Function = function (array:Array) {
var mclo:MovieClipLoader = new MovieClipLoader();
var mcli:Object = new Object();
var index:Number = 0;
var shifting:Number = 2000;
var test:MovieClip = _level0.createEmptyMovieClip("test", 1);
mcli.onLoadProgress = function(target:MovieClip, lbytes:Number, tbytes:Number) {
trace("Caricamento..."+Math.floor((lbytes/tbytes)*100)+"%");
};
mcli.onLoadInit = function(target:MovieClip):Void {
index = (index>=array.length-1) ? 0 : index+1;
var t:Object = new mx.transitions.Tween(target, "_alpha", mx.transitions.easing.None.easeNone, 0, 100, .5, true);
t.onMotionFinished = function() {
var a = setInterval(function () {
clearInterval(a);
var t:Object = new mx.transitions.Tween(target, "_alpha", mx.transitions.easing.None.easeNone, 100, 0, .5, true);
t.onMotionFinished = function() {
mclo.loadClip("img/"+array[index].image, target);
};
}, shifting);
};
};
mclo.addListener(mcli);
mclo.loadClip("img/"+array[index].image, test);
};
var xmlUrl:String = "images.xml";
var parseArray:Array = new Array();
var parseXML:XML = new XML();
parseXML.ignoreWhite = true;
parseXML.onLoad = function(success:Boolean):Void {
if (this.loaded) {
var temp:Array = this.firstChild.childNodes;
for (var i = 0; i<temp.length; i++) {
parseArray.push({image:temp[i].childNodes[0].firstChild.toString(), caption:temp[i].childNodes[1].firstChild.toString()});
}
slideShow(parseArray);
}
};
parseXML.load(xmlUrl);
sostanzialmente il codice riprende lo slideshow della mia firma (senza xml o altro), ma ha in più il parsing del file esterno
la parte in rosso è quella che gestisce il preload grafico, in questo caso io ho utilizzato un semplice trace, ma è possibile usare una barra ad esempio da "attaccare" all'inizio del caricamento (onLoadStart, che non ho implementato), e staccare alla fine (onLoadComplete, che non ho implementato)
diciamo per completezza che riprendiamo il codice di sopra e consideriamo di avere una barra nella libreria, concatenata con nome "loadbar", di dimensioni 200x20 px, poi consideriamo di avere uno stage di 800x600 px (tutto questo per dare una posizione centrale alla barra al momento in cui la attacchiamo)... per questo la nostra barra al momento in cui viene attaccata, avrà posizione x=(800-200)/2 e y=(600-20)/2
codice:
var slideShow:Function = function (array:Array) {
var mclo:MovieClipLoader = new MovieClipLoader();
var mcli:Object = new Object();
var index:Number = 0;
var shifting:Number = 2000;
var test:MovieClip = _level0.createEmptyMovieClip("test", 1);
mcli.onLoadStart = function() {
_level0.attachMovie("loadbar", "loadbar", _level0.getNextHighestDepth(), {_x:300, _y:290, _xscale:0});
}
mcli.onLoadProgress = function(target:MovieClip, lbytes:Number, tbytes:Number) {
var perc = Math.floor((lbytes/tbytes)*100);
_level0["loadbar"]._xscale = perc;
};
mcli.onLoadComplete = function(){
_level0["loadbar"].removeMovieClip();
}
mcli.onLoadInit = function(target:MovieClip):Void {
index = (index>=array.length-1) ? 0 : index+1;
var t:Object = new mx.transitions.Tween(target, "_alpha", mx.transitions.easing.None.easeNone, 0, 100, .5, true);
t.onMotionFinished = function() {
var a = setInterval(function () {
clearInterval(a);
var t:Object = new mx.transitions.Tween(target, "_alpha", mx.transitions.easing.None.easeNone, 100, 0, .5, true);
t.onMotionFinished = function() {
mclo.loadClip("img/"+array[index].image, target);
};
}, shifting);
};
};
mclo.addListener(mcli);
mclo.loadClip("img/"+array[index].image, test);
};
var xmlUrl:String = "images.xml";
var parseArray:Array = new Array();
var parseXML:XML = new XML();
parseXML.ignoreWhite = true;
parseXML.onLoad = function(success:Boolean):Void {
if (this.loaded) {
var temp:Array = this.firstChild.childNodes;
for (var i = 0; i<temp.length; i++) {
parseArray.push({image:temp[i].childNodes[0].firstChild.toString(), caption:temp[i].childNodes[1].firstChild.toString()});
}
slideShow(parseArray);
}
};
parseXML.load(xmlUrl);