【问题标题】:Loading image into flash project dynamically将图像动态加载到 Flash 项目中
【发布时间】:2011-09-30 12:51:32
【问题描述】:

我正在尝试创建一个 as3 项目,该项目可以动态地从数据库中提取图像并将它们粘贴到我用它制作的 Flash 电影的框架中。目前我正在关注一个教程(在 as2 中,并且我正在将其转换为 as3)并试图从与项目相同的目录中加载图像,但我遇到了加载器的问题。我是 as3 的新手,因此几乎不知道我在做什么,所以我向你们寻求帮助,了解为什么我的程序无法正常运行。这是我项目的全部代码。

import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.display.*;
import com.greensock.TweenLite;
import com.greensock.easing.*;

var xmlPath = "content.xml";
var photos_xml:XML = new XML();
var imageList:XMLList = new XMLList();
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, loadXML)
var imageLoader:Loader = new Loader();
imageLoader.addEventListener(Event.INIT, initHandler);
imageLoader.addEventListener(Event.COMPLETE, completeHandler);
var currentImage:Number = 0;
var timer:Number;

xmlLoader.load(new URLRequest(xmlPath));

//stop();

function loadXML(e:Event):void
{
    photos_xml = new XML(e.target.data);
    imageList = photos_xml.image.text();

    //for (var i:int = 0; i < imageList.length(); i++)
//  {
//      trace (imageList[i]);
//  }

    loadImage();
}

function loadImage()
{
    var loadURL = imageList[currentImage]
    var req:URLRequest = new URLRequest(loadURL);
    var targetClip:MovieClip = new MovieClip();
    targetClip.alpha = 0;
    clearInterval(timer);

    //trace(loadURL);
    //======== imageLoader refuses to throw events! ===========
    trace(req.url)
    imageLoader.load(req);
    targetClip.addChild(imageLoader);
    shell_mc.pics_mc.addChild(targetClip);

    trace("I am in loadImage");
}

function setTimer():void
{
    timer = setInterval(loadImage, 1000);
}

function removePrevious(prevImg:MovieClip):void
{
    if (prevImg != null)
    {
        removeChild(prevImg);
        //removeMovieClip(prevImg);
    }

    //trace(currentImage);
    currentImage = (currentImage + 1) % imageList.length();
}

function initHandler(event:Event):void
{
    trace("I am in initHandler");
    TweenLite.to(shell_mc.background_mc, 0.25, {width:event.target.width + 20, height:event.target.height + 20, ease:Quad.easeOut});
    TweenLite.to(shell_mc.border_mc, 0.25, {width:event.target.width, height:event.target.height, ease:Quad.easeOut});
    TweenLite.to(shell_mc.mask_mc, 0.25, {width:event.target.width, height:event.target.height, ease:Quad.easeOut});

    var clipXTarg = Math.round((stage.width / 2) - ((event.target.width + 20) / 2));
    var clipYTarg = Math.round((stage.height / 2) - ((event.target.height + 20) / 2));
    TweenLite.to(shell_mc, 0.25, {x:clipXTarg, y:clipYTarg, ease:Quad.easeOut});

    var prevImgNum:Number;
    if (currentImage == 0)
    {
        prevImgNum = imageList.length() - 1;
    }
    else
    {
        prevImgNum = currentImage - 1;
    }
    var prevImg = shell_mc.pics_mc["pic" + prevImgNum];
    TweenLite.to(prevImg, 0.25, {autoAlpha:0, onComplete:removePrevious(prevImg)});
}

function completeHandler(event:Event):void
{
    trace("I am in completeHandler");
    TweenLite.to(event.target, 0.25, {autoAlpha:100, delay:0.25});
    setTimer();
}

这里的问题是 imageLoader 在加载图像文件时不会引发任何事件,并且绝对没有错误可以告诉我为什么它可能会失败。这是我的 xml 文件的外观:

资产/DaVinci1.jpg 资产/DaVinci2.jpg 资产/DaVinci3.jpg

项目和资产文件夹都在同一个目录下,所以文件路径应该不是问题,否则我不知道。这是我正在关注的教程(http://active.tutsplus.com/tutorials/xml/flash-slideshow-xml/)

【问题讨论】:

    标签: actionscript-3 actionscript


    【解决方案1】:

    当您加载 swfimage 类型时,您需要将 eventListener 添加到 loader 而不是 contentLoaderInfo

    contentLoader   = new Loader ();
    
    contentLoader.contentLoaderInfo.addEventListener ( Event.COMPLETE, handleComplete );
    contentLoader.contentLoaderInfo.addEventListener ( ProgressEvent.PROGRESS, handleProgress );
    contentLoader.contentLoaderInfo.addEventListener ( ErrorEvent.ERROR, handleError );
    contentLoader.contentLoaderInfo.addEventListener ( IOErrorEvent.IO_ERROR, handleError );
    contentLoader.contentLoaderInfo.addEventListener ( SecurityErrorEvent.SECURITY_ERROR, handleError );
    

    以及何时需要使用 XMLLoader 加载数据(基于文本的文件)

    dataLoader              = new URLLoader ();
    
    dataLoader.addEventListener ( Event.COMPLETE, handleComplete );
    dataLoader.addEventListener ( ProgressEvent.PROGRESS, handleProgress );         
    dataLoader.addEventListener ( ErrorEvent.ERROR, handleError );
    dataLoader.addEventListener ( IOErrorEvent.IO_ERROR, handleError );
    dataLoader.addEventListener ( SecurityErrorEvent.SECURITY_ERROR, handleError );
    

    【讨论】:

    • 你是个天才!多亏了你,我得到了进入下一部分的代码:D!我很惊讶我检查的任何地方实际上都没有指出事件监听器应该继续使用 contentLoaderInfo 的事实。似乎是一个很好的信息知道。但是再次感谢,现在要加载图像:P
    【解决方案2】:

    您需要将您的听众添加到loader.contentLoaderInfo,而不是loader

    imageLoader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
    imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
    
    function completeHandler(event:Event):void
    {
        trace("I am in completeHandler");
        TweenLite.to(event.target.content, 0.25, {autoAlpha:100, delay:0.25});
        setTimer();
    }
    

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#contentLoaderInfo

    【讨论】:

    • 您似乎没有将 target.content 添加到舞台或其他先前添加的元素中。因此我认为它不会出现。
    • 他在loadImage()函数中添加了targetClip.addChild(imageLoader);
    • 两种方式都可以,直接添加Loader到显示列表,或者你可以等到加载完毕再将加载的内容添加到显示列表。我更喜欢第二种选择,因为这样我就可以摆脱 Loader 和所有侦听器以防止内存泄漏...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多