我正在尝试将一堆(大约100个)图像加载到内存中,因此我可以在不同时间显示它们。最初我只是简单地嵌入了它们,但这当然导致swf文件比我想要的要大。所以现在我正在尝试更改它以在后台加载它们,因为它们不是立即需要的。
这可能有很多问题。目前的情况是,我收到的错误是“TypeError:错误#1034:类型强制失败:无法将”foo.jpg“转换为Class。”
我一直在谷歌搜索这段时间,假设加载外部图像是常见的事情。这就是我获得Loader和URLRequest代码的地方,但我显然遗漏了一些东西。也许这是由于我愚蠢的循环逻辑。
这是迄今为止的课程
public class CardImages2
{
public static var fooImage1:Class;
public static var fooImage2:Class;
public static var fooImage3:Class;
public static var fooImage4:Class;
private static var curImgClass:Class;
public static function load():void {
// map of cards and their urls
var dict:Dictionary = new Dictionary;
dict[fooImage1] = "fooImage1.jpg";
dict[fooImage2] = "fooImage2.jpg";
dict[fooImage3] = "fooImage3.jpg";
dict[fooImage4] = "fooImage4.jpg";
var url:String;
var loader:Loader = new Loader();
var urlReq:URLRequest;
for each(var key:Class in dict) {
url = String(dict[key]);
curImgClass = key;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadListener);
urlReq = new URLRequest(encodeURI(url));
loader.load(urlReq);
}
}
private static function loadListener(e:Event):void {
curImgClass.source = Class(e.currentTarget.content);
}
}
答案 0 :(得分:1)
这里可能会有一些事情发生,取决于你想要完成的事情。
虽然可以加载位图数据并从中创建Class对象供以后使用,但加载位图数据并存储位图更常见,因为你不太可能想要创建位图数据的多个实例一次你加载它,出于很多原因,其中最重要的是内存开销。
Alex建议使用BulkLoader是一个很好的建议,但为了说明一种解决问题的方法,我将这个例子拼凑在一起,它将三个图像作为Bitmap实例加载到Dictionary对象中:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
private var loaders:Dictionary;
private var images:Dictionary;
private var imageUrls:Array = ["Image1.png", "Image2.png", "Image3.png"];
private function onCreationComplete():void
{
loadImages();
}
private function loadImages():void
{
loaders = new Dictionary();
images = new Dictionary();
for each (var imageUrl:String in imageUrls)
{
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load(new URLRequest(imageUrl));
loaders[urlLoader] = imageUrl;
}
}
private function onURLLoaderComplete(event:Event):void
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
loader.loadBytes(event.target.data);
loaders[loader.contentLoaderInfo] = loaders[event.target];
delete loaders[event.target];
}
private function onLoaderComplete(event:Event):void
{
images[loaders[event.target]] = event.target.content;
delete loaders[event.target];
}
]]>
</mx:Script>
<!-- These won't bind, but should illustrate how to access the bitmaps -->
<mx:Image source="{images['Image1.png']}" />
<mx:Image source="{images['Image2.png']}" />
<mx:Image source="{images['Image3.png']}" />
</mx:Application>
这是一个很好的代码,但步骤非常简单:
一旦加载完成,你应该有一个可用的词典,由你的图像URL(或文件名,或任何你喜欢的)键入,包含每个单独的图像实例。从那里,如果你需要创建Class对象(例如,用作自定义游标等),你可以 - 回帖如果那是你想要做的,我们将从那里拿起它。 / p>
答案 1 :(得分:0)
您应该尝试bulk-loader。我已经在几个项目中使用过它并且效果很好。只要确保在它之后进行清理,因为它可能是一个内存耗尽,如果你加载了100张图像,可能会导致一个非常令人讨厌的泄漏。