我想知道是否有可能实现任何逻辑来为图像完成加载而不会冻结。
为了我的应用程序,我创建了一个类,它在构造函数中获取图像url并使用“load()”函数加载mx.controls.Image。
见下面的课程
package com
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
//import flash.net.URLRequest;
import mx.controls.Alert;
import mx.controls.Image;
//import mx.utils.OnDemandEventDispatcher;
public class SpriteImage extends Sprite
{
//Pass the source path or url here.
private var imageUrl:String;
private var ready:int = -1;
private var img:Image;
public function SpriteImage(imgUrl:String)
{
//imageUrl = imgUrl;
loadImage(imgUrl);
}
private function loadImage(imgUrl:String):void
{
img = new Image();
img.addEventListener(Event.COMPLETE,onCompleteHandler);
img.addEventListener(IOErrorEvent.IO_ERROR,onErrorHandler);
//img.source = imgUrl;
img.load(imgUrl);
}
private function onCompleteHandler(e:Event):void{
img.x = -(img.width/2);
img.y = -(img.height/2);
this.addChild(img);
ready = 1;
}
private function onErrorHandler(e:IOErrorEvent):void
{
ready = 0;
//Alert.show("Can't load :" + e.toString());
}
public function prepare():Boolean{
while(ready == -1){
trace(0);
}
return ready;
}
}
}
现在,我在主应用程序中使用此类
var img:SpriteImage = new SpriteImage(e.imageUrl);
img.prepare(); // just waits till image is loaded but freezes
var obj:DisplayObject = img;
现在的问题是应用程序永远不会出现在prepare()方法中。它冻结了浏览器,我必须杀死插件进程才能取消应用程序。
这里的主要标准是我需要等待图像完成加载,以便我可以在接下来的步骤中访问图像。我怎样才能做到这一点。?请帮忙
答案 0 :(得分:1)
在我看来,你正在使用同时创建冻结(ready == -1)为什么不禁用用户进一步执行“步骤”的能力“直到图像加载?
您不必同步等待图像加载您现在的方式。加载图像后,您将通过其加载程序调度的完整事件获得通知。然后,您可以启用任何取决于正在加载的图像。
一种直接的方法是将应用程序中导航控件的 enabled 属性绑定到布尔属性。例如,在你的SpriteImage中添加
[Bindable] public var isImageLoaded:Boolean = false;
并在调用onCompleteHandler后将其设置为true。您可以绑定到该属性的值。另一种方法是从您的班级发送一个事件,以通知其他人图像已加载并且可能发生某些事情:]
火焰
答案 1 :(得分:0)
ProgressBar
可能会在加载图片时以不冻结的方式为您的用户界面增添趣味。
查看Adobe docs for the ProgressBar control。标题为创建ProgressBar控件的段落有一个示例,说明如何在加载图像时显示ProgressBar
。