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 永远不会触发?追踪bytesLoaded
和bytesTotal
- 有时它们并不完全相等。
我认为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 事件不会触发的主要内容,如果未能解决你的问题,请参考以下文章