AS3 Preloader 在本地无法工作,loaderInfo ProgressEvent.PROGRESS 事件不会触发

Posted

技术标签:

【中文标题】AS3 Preloader 在本地无法工作,loaderInfo ProgressEvent.PROGRESS 事件不会触发【英文标题】:AS3 Preloader doesn't work locally, loaderInfo ProgressEvent.PROGRESS event does not fire 【发布时间】:2014-05-25 00:06:38 【问题描述】:

制作自定义 AS3 预加载器时,我注意到当我的 SWF 在本地 (file:///) 执行时,在 Chrome 等网络浏览器中预览时,预加载器会卡在加载屏幕中。

当从远程服务器或通过独立的 Flash Player 执行时,它可以工作。我注意到其他具有预加载器的 SWF 没有这个问题。我需要改变什么?

this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, preloaderProgress);

function preloaderProgress(event:ProgressEvent):void 

    var loadedPercent:Number = event.bytesLoaded/event.bytesTotal*100;

    if (loadedPercent == 100)
        this.gotoAndStop(2);
    

【问题讨论】:

您确定 ProgressEvent 永远不会触发?追踪bytesLoadedbytesTotal - 有时它们并不完全相等。 我认为loadedPercent 是一个数字的精度可能有问题,所以我将其更改为int,但这并没有做任何事情。如果有 ProgressEvent.COMPLETE,也许触发会更可靠。 【参考方案1】:

按照http://stephenscholtz.com/201110/single-movie-flash-preloading-as3的示例

好像没有ProgressEvent.COMPLETE,但是有一个Event.COMPLETE,有点混乱。

我将代码更改为以下内容,(还包括对右键菜单的一些调整,以禁止用户在电影加载之前右键单击并按下播放等)

//Initialize any variables
var loadedPercent:Number = 0;

//Remove all items from right click Flash Player menu (except Quality, and the mandatory About... & Settings...)
var cxMenu:ContextMenu = new ContextMenu();
cxMenu.hideBuiltInItems();
cxMenu.builtInItems.quality = true;
this.contextMenu = cxMenu;

/* or disable right click menu completely (Flash Player 11.2.202.228 and over) */
/* this.addEventListener(MouseEvent.RIGHT_CLICK, onMouseRightClick);
function onMouseRightClick(event:MouseEvent) 

    return false;
 */

//Disable shortcut keys and window menubar when played from desktop Standalone Flash Player app
if (Capabilities.playerType == "StandAlone" || Capabilities.playerType == "External") 
    fscommand("showmenu", "false");
    fscommand("trapallkeys", "true");


/* Preloader: begin */

//Update loading bar and percent text as SWF loads
function onProgress(e:Event) 

    //Get the amount of bytes that have been loaded / bytes total to load
    loadedPercent = this.loaderInfo.bytesLoaded/this.loaderInfo.bytesTotal*100;

    //Update the text of _preloaderProgress movieclip
    _preloaderProgress.text = int(loadedPercent)+"%";

    //Update the _preloaderBar amount by scaling horizontally as it loads
    _preloaderBar.scaleX = loadedPercent/100;



//Go to next frame after everything loads
function init(e:Event) 
    gotoAndStop(2);


//Attach the events to the stage
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
this.loaderInfo.addEventListener(Event.COMPLETE, init);

/* Preloader: end */

//Stop to 1st frame and wait until it is loaded
stop();

这将允许电影在远程和本地播放都没有问题。

【讨论】:

【参考方案2】:

本地加载速度非常快。您不仅应该使用 Event.COMPLETE 而不是 ProgessEvent 检查文件是否已完全加载,而且您还应该确保在实际调用 load 之前注册您的监听器,否则文件可能会在您注册监听器之前完全加载。

【讨论】:

以上是关于AS3 Preloader 在本地无法工作,loaderInfo ProgressEvent.PROGRESS 事件不会触发的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 Flash Preloader as3代码就像苹果风格。

无法使用 AS3.0 XMLSocket 连接到服务器

搜索框 as3 无法正常工作

AS3 将多个文本框数据保存并加载到本地文件

网站的 JavaScript 预加载器,它不工作的 IE,

求教,WIN7 64位系统下MT65XX preloader驱动安装失败,无法线刷