我正在尝试加载带有Loader对象的ActionScript PNG图像。这对于一些图像(INIT和COMPLETE事件按预期触发)工作得很好,对于其他一些图像则不然。我在这个线程中读到,一个URLLoader可能会有所帮助,所以我尝试了,使用loadBytes()函数之后。仍然不起作用:URLLoader触发COMPLETE事件,但LoaderInfo对象没有。
我写了一个示例类,用两个文件(一个工作,另一个不工作)演示了这个问题。
public class LoaderTest extends MovieClip {
var output:TextField;
var loader:Loader;
var urlLoader:URLLoader;
function LoaderTest() {
output = new TextField();
output.width = 1000;
output.height = 1000;
output.multiline = true;
addChild(output);
var t1:Timer = new Timer(0, 0);
t1.addEventListener(TimerEvent.TIMER, function() {
t1.stop(); loadMapDirect("map_in_big.png");
});
var t2:Timer = new Timer(1000, 0);
t2.addEventListener(TimerEvent.TIMER, function() {
t2.stop(); loadMapDirect("map_us_big.png");
});
var t3:Timer = new Timer(2000, 0);
t3.addEventListener(TimerEvent.TIMER, function() {
t3.stop(); loadMapBytes("map_in_big.png");
});
var t4:Timer = new Timer(3000, 0);
t4.addEventListener(TimerEvent.TIMER, function() {
t4.stop(); loadMapBytes("map_us_big.png");
});
t1.start();
t2.start();
t3.start();
t4.start();
}
function loadMapBytes(url:String):void {
try {
urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressListener);
urlLoader.addEventListener(Event.COMPLETE, completeListenerBytes);
output.appendText("nLoading '"+url+"' with URLLoader ");
urlLoader.load(new URLRequest(url));
} catch (error:Error) {
output.appendText("Err: " + error.message + "n");
}
}
function completeListenerBytes(e:Event):void {
output.appendText("COMPLETE Event fired for URLLoader!n");
try {
loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListenerDirect);
output.appendText("Loading bytes with Loader ");
loader.loadBytes(e.target.data as ByteArray);
} catch (error:Error) {
output.appendText("Err: " + error.message + "n");
}
}
function loadMapDirect(url:String):void {
try {
loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListenerDirect);
output.appendText("nLoading '"+url+"' with Loader ");
loader.load(new URLRequest(url));
} catch (error:Error) {
output.appendText("Err: " + error.message + "n");
}
}
function completeListenerDirect(e:Event):void {
var bmd:BitmapData = Bitmap(e.target.loader.content).bitmapData;
output.appendText("COMPLETE Event fired for Loader! => h: " + bmd.height + ", w: " + bmd.width + "n");
}
function progressListener (e:ProgressEvent):void{
output.appendText(".");
if (e.bytesLoaded == e.bytesTotal) {
output.appendText(" progress complete, " + e.bytesTotal + " bytes loaded!n");
}
}
}
所有图片都是用PHP GD库生成的,我正在用SWFTools的as3compile进行编译。
您可以在http://www.wichte-sind-wichtig.de/as3loader/loaderTest.swf
上看到脚本的运行情况。两个图片map_in_big.png和map_us_big.png在同一个文件夹中(不允许发布更多的超链接)
任何想法?
问题是您的应用程序可能是为Flash Player 9编译的。在版本9中,允许的最大图像尺寸为2880 x 2800, map_us_big.png为3150 x 1570。当我为Flash Player 10编译它时,我成功地运行了该应用程序。
这里有一个参考http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#BitmapData%28%29
在AIR 1.5和Flash Player 10中,BitmapData的最大大小对象的宽度或高度为8,191像素,并且像素不能超过16,777,215像素。如果一个BitmapData对象是宽8,191像素,高只能为2,048像素。)在Flash Player9及更早版本和AIR 1.1及更早版本,限制是2880像素高2880像素宽。如果您指定了宽度或高度值大于2880,则不创建新实例。