我有两个类,称它们为A和B.它们都包含一个Loader对象。在A类中,我将内容加载到Loader对象中。
public class A {
var loader:Loader;
public function A():void {
loader = new Loader();
this.addChild(loader);
loader.load(...);
}
}
public class B() {
var loader:Loader;
public function B():void {
loader = new Loader();
this.addChild(loader);
}
}
我现在需要将A的加载器分配给B的加载器(在加载完成后)。
在其他一些类中,我有一个A和B的实例。直接分配加载器值似乎不起作用(当显示B时,不显示A的加载器内容)。
var b:B = new B();
var a:A = new A();
// ... I wait for a's loader to be loaded ...
// ... then ...
b.loader = a.loader;
addChild(b);
// A's Loader is not shown ...
如果我执行以下操作,则可以:
b.addChild(a.loader);
但这不是我想要的。当我知道我只有一个孩子而只想改变其内容时,我不想管理一群孩子。
有没有办法直接复制/分配Loader?我尝试分配'内容',但这是只读的。还有其他方法可以做到这一点吗?基本上我有一个Loader对象数组,所有这些对象都加载了图像。然后我在舞台上有一个Loader,我想从我的阵列中分配图像(Loaders)。
感谢。
答案 0 :(得分:1)
我做了这样的事情是为了好玩:
var a:Loader = new Loader();
a.contentLoaderInfo.addEventListener(Event.COMPLETE, aLoaded);
a.load(new URLRequest('A.swf'));
addChild(a);
var b:Loader = new Loader();
b.contentLoaderInfo.addEventListener(Event.COMPLETE, bLoaded);
addChild(b);
function aLoaded(event:Event):void {
trace('a loaded');
event.currentTarget.removeEventListener(Event.COMPLETE, aLoaded);
b.loadBytes(a.loaderInfo.bytes);
}
function bLoaded(event:Event):void {
event.currentTarget.removeEventListener(Event.COMPLETE, bLoaded);
trace('b loaded');
}
使用loader的loadBytes和loaderInfo的bytes我创建了一个无限循环,其中加载a,加载b,加载a,加载b,加载a,加载b ...以及循环整体开始出现
请勿这样做!
这不是你需要的,你正在使用图像,所以加载器content应该是一个位图。您可以访问和克隆bitmapData,因为您有权访问像素(例如,crossdomain策略和新的LoaderContext(true)作为load()调用中的第二个参数)。
所以你的答案应该简单:
var a:Loader = new Loader();
a.contentLoaderInfo.addEventListener(Event.COMPLETE, aLoaded);
a.load(new URLRequest('app_image.jpg'));
addChild(a);
function aLoaded(event:Event):void {
if(a.content is Bitmap){//check if it's actually an image, not a swf
var clonedData:Bitmap = Bitmap(a.content).bitmapData.clone();
//do whatever you need with the clone
//e.g. var dolly:Bitmap = new Bitmap(clonedData);//etc
}
}
这不是OOP代码,它只是最小的东西,所以你可以很容易地得到图片:)
答案 1 :(得分:0)
我最终交换了孩子以获得同样的效果。它没有我想象的那么复杂。
所以基本上在B中我做了:
this.setChildIndex(loader,0);
这是为了确保加载器在索引0处。(它可以是任何固定索引,但在我的情况下,我需要它出现在底部)。最初没有必要在B中加载一个加载器,但我只是把它放在那里以确保在索引0处有一些固定的东西(所以我不会意外删除其他一些孩子)。
然后当将A的加载器设置为B时,我只需将索引为0的子项换掉。
b.removeChildAt(0);
b.addChildAt(a.loader,0);
这不是我想要的解决方案,但它到目前为止运作良好。
答案 2 :(得分:0)
根据我的理解,你想为你的b类创建一个setLoader方法。
之类的东西public class B() {
var loader:Loader;
public function B():void {
// nothing here, unless you really
// want a b.loader before stting it from outside
}
public function setLoader(_l:Loader){
if(loader) removeChild(loader);
loader = _l;
addChild(_l);
}
}
然后,您可以在加载a时调用
b.setLoader(a.loader);
请注意a.loader不再是孩子了(如果你显示一个,它将是空的),但你仍然可以使用a.loader和b.loader访问它。
告诉我这是否有帮助。