代码之家  ›  专栏  ›  技术社区  › 

将文件夹中的图像加载到幻灯片中

  •  0
  •  · 技术社区  · 5 年前

    我有一个AS3幻灯片代码,它加载一个带有图像列表的XML。我要寻找的是一种跳过XML部分的方法,只需将所有图像加载到“images”文件夹中?

    如何添加一个常量布尔值来决定是否随机播放图像? 常量随机:布尔值=真。。。

    // 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();
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Alan Plum    15 年前

    如果您在服务器上使用PHP

    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>';
    

    只需将幻灯片应用程序指向PHP脚本,它就会动态创建列表。

        2
  •  0
  •   Theo.T    15 年前

    如果希望跳过加载,您可以简单地将XML集成到actionscript中:

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

    如果你想跳过这个,你可以用某种方式命名图像,这样你就可以盲目地加载它们( image0.jpg,image1.jpg, 等等),直到加载序列抛出一个错误(当然是您捕捉到的)作为 图像 不存在(这是肮脏的!)。

    在这种情况下,最好有一个小小的服务器端脚本,列出给定文件夹中的所有文件,并将它们的引用输出到可以从SWF检索的XML中。

        3
  •  0
  •   Alex Jillard    15 年前

    除非您通过AIR部署flash应用程序,否则您无法访问系统,因此无法读取文件夹的所有内容。

    您可以使用PHP或您选择的服务器端语言来读取文件夹的内容并构造要加载的xml。

    换衣服 strXMLPath http://example.com/yourphpfile.php 它将作为xml文档加载。您应该将mimetype更改为 mimetype="application/xml" .