Laden Sie Bilder aus dem Ordner in Diashow
-
20-08-2019 - |
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();
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"
.