Frage

Ich habe diesen AS3 -Diashow -Code, der eine XML mit einer Liste von Bildern lädt. Was ich suche, ist eine Möglichkeit, den XML -Teil zu überspringen und einfach alle Bilder im Ordner "Bilder" zu laden?

Wie kann ich einen konstanten Booleschen hinzufügen, der entscheidet, ob es die Bilder zufällig abspielen sollte oder nicht? const random: boolean = true; ...

// import tweener
import caurina.transitions.Tweener;

// delay between slides
const TIMER_DELAY:int = 2000;
// fade time between slides
const FADE_TIME:Number = 1;

// flag for knowing if slideshow is playing
var bolPlaying:Boolean = true;
// reference to the current slider container
var currentContainer:Sprite;
// index of the current slide
var intCurrentSlide:int = -1;
// total slides
var intSlideCount:int;
// timer for switching slides
var slideTimer:Timer;
// slides holder
var sprContainer1:Sprite;
var sprContainer2:Sprite;
// slides loader
var slideLoader:Loader;
// url to slideshow xml
var strXMLPath:String = "slideshow.xml";
// slideshow xml loader
var xmlLoader:URLLoader;
// slideshow xml
var xmlSlideshow:XML;

function initSlideshow():void { 
    // create new urlloader for xml file
    xmlLoader = new URLLoader();
    // add listener for complete event
    xmlLoader.addEventListener(Event.COMPLETE, onXMLLoadComplete);
    // load xml file
    xmlLoader.load(new URLRequest(strXMLPath));

    // create new timer with delay from constant
    slideTimer = new Timer(TIMER_DELAY);
    // add event listener for timer event
    slideTimer.addEventListener(TimerEvent.TIMER, nextSlide);

    // create 2 container sprite which will hold the slides and
    // add them to the masked movieclip
    sprContainer1 = new Sprite();
    sprContainer2 = new Sprite();
    mcSlideHolder.addChild(sprContainer1);
    mcSlideHolder.addChild(sprContainer2);

    // keep a reference of the container which is currently
    // in the front
    currentContainer = sprContainer2;
}

function onXMLLoadComplete(e:Event):void {
    // create new xml with the received data
    xmlSlideshow = new XML(e.target.data);
    // get total slide count
    intSlideCount = xmlSlideshow..image.length();
    // switch the first slide without a delay
    switchSlide(0);
}

function fadeSlideIn(e:Event):void {
    // add loaded slide from slide loader to the
    // current container
    addSlideContent();

    // check if the slideshow is currently playing
    // if so, show time to the next slide. If not, show
    // a status message
    if(bolPlaying) {
    } else {
    }
    // fade the current container in and start the slide timer
    // when the tween is finished
    Tweener.addTween(currentContainer, {alpha:1, time:FADE_TIME, onComplete:onSlideFadeIn});
}

function onSlideFadeIn():void {
    // check, if the slideshow is currently playing
    // if so, start the timer again
    if(bolPlaying && !slideTimer.running)
        slideTimer.start();
}

function switchSlide(intSlide:int):void {
    // check if the last slide is still fading in
    if(!Tweener.isTweening(currentContainer)) {
        // check, if the timer is running (needed for the
        // very first switch of the slide)
        if(slideTimer.running)
            slideTimer.stop();
        // change slide index
        intCurrentSlide = intSlide;
        // check which container is currently in the front and
        // assign currentContainer to the one that's in the back with
        // the old slide
        if(currentContainer == sprContainer2)
            currentContainer = sprContainer1;
        else
            currentContainer = sprContainer2;
        // hide the old slide
        currentContainer.alpha = 0;
        // bring the old slide to the front
        mcSlideHolder.swapChildren(sprContainer2, sprContainer1);
        // delete loaded content
        clearLoader();
        // create a new loader for the slide
        slideLoader = new Loader();
        // add event listener when slide is loaded
        slideLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, fadeSlideIn);
        // load the next slide
        slideLoader.load(new URLRequest(xmlSlideshow..image[intCurrentSlide].@src));
    }
}

function nextSlide(e:Event = null):void {
    // check, if there are any slides left, if so, increment slide
    // index
    if(intCurrentSlide + 1 < intSlideCount)
        switchSlide(intCurrentSlide + 1);
    // if not, start slideshow from beginning
    else
        switchSlide(0);
}

function previousSlide(e:Event = null):void {
    // check, if there are any slides left, if so, decrement slide
    // index
    if(intCurrentSlide - 1 >= 0)
        switchSlide(intCurrentSlide - 1);
    // if not, start slideshow from the last slide
    else
        switchSlide(intSlideCount - 1);
}

function clearLoader():void {
    try {
        // get loader info object
        var li:LoaderInfo = slideLoader.contentLoaderInfo;
        // check if content is bitmap and delete it
        if(li.childAllowsParent && li.content is Bitmap){
            (li.content as Bitmap).bitmapData.dispose();
        }
    } catch(e:*) {}
}

function addSlideContent():void {
    // empty current slide and delete previous bitmap
    while(currentContainer.numChildren){Bitmap(currentContainer.getChildAt(0)).bitmapData.dispose(); currentContainer.removeChildAt(0);}

    // create a new bitmap with the slider content, clone it and add it to the slider container
    var bitMp:Bitmap =  new Bitmap(Bitmap(slideLoader.contentLoaderInfo.content).bitmapData.clone());
    currentContainer.addChild(bitMp);
}

// init slideshow
initSlideshow();
War es hilfreich?

Lösung

Wenn Sie PHP auf Ihrem Server verwenden, so etwas wie

header('Content-type: applicaiton/xml;charset=utf-8');
$dir = dir('images');
echo '<images>', "\n";
foreach ($dir as $file) {
    if ($file == '.' || $file == '..') {
        continue;
    }
    echo '<image>', $file, '</image>', "\n";
}
echo '</images>';

sollte den Trick machen.

Zeigen Sie einfach Ihre Diashow -App auf das PHP -Skript und erstellt die Liste dynamisch.

Andere Tipps

Nun, Sie können das XML einfach in ActionsScript integrieren, wenn Sie das Laden überspringen möchten:

var xmlSlideshow:XML = <images><image /><image /></ images>;

Falls Sie dies auch überspringen möchten, können Sie die Bilder auf eine bestimmte Weise benennen, damit Sie sie blind laden können ((Image0.jpg, Image1.jpg, usw.), bis Ihre Ladesequenz einen Fehler auslöst (den Sie natürlich fangen) als die Bild existiert nicht (das ist schmutzig!).

Das Beste in dieser Situation ist, ein winziges Server -Seitenskript zu haben, das alle Dateien in einem bestimmten Ordner auflistet und ihre Referenzen in ein XML ausgibt, das von Ihrem SWF abgerufen werden kann.

Wenn Sie Ihre Flash -App nicht über Luft bereitstellen, haben Sie keinen Zugriff auf das System, sodass Sie nicht den gesamten Inhalt eines Ordners lesen können.

Sie können PHP oder Ihre Server -Seitensprache der Wahl verwenden, um den Inhalt eines Ordners zu lesen und die XML zu konstruieren, die Sie laden.

Nur ändern strXMLPath zu http://example.com/yourphpfile.php Und es wird als XML -Dokument geladen. Sie sollten den Mimetyp an ändern mimetype="application/xml".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top