Я имею два класса, называю их A и B. Они оба содержат объект Загрузчика. В классе A я загружаю содержание в объект Загрузчика.
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);
Но это не то, что я хочу. Я не хочу управлять набором детей, когда я знаю, что только имею одного ребенка, но просто хочу изменить его содержание.
Существует ли способ копировать/присваивать Загрузчик непосредственно? Я пытался присвоить 'содержанию', но это только для чтения. Есть ли иначе, я могу сделать это? В основном у меня есть массив объектов Загрузчика, что все загружаются изображениями. У меня затем есть единственный Загрузчик, это находится на этапе, и я хочу присвоить ему изображения (Загрузчики) от моего массива.
Спасибо.
В итоге я поменял местами дочерние элементы, чтобы получить тот же эффект. Это менее сложно, чем я думал.
Итак, в основном в B я сделал:
this.setChildIndex(loader,0);
Это нужно для того, чтобы убедиться, что загрузчик имеет индекс 0. (Это может быть любой фиксированный индекс, но в моем случае мне нужно, чтобы он отображался внизу). Первоначально нет необходимости иметь загрузчик в B, но я просто поместил его туда, чтобы убедиться, что что-то исправлено с индексом 0 (чтобы я случайно не удалил другого ребенка).
Затем, установив загрузчик A в значение B, я бы просто заменил дочерний элемент с индексом 0.
b.removeChildAt(0);
b.addChildAt(a.loader,0);
Это не совсем то решение, которое я хотел, но пока оно работает хорошо.
Я сделал что-то вроде этого для забавы:
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');
}
с помощью загрузчика loadBytes и loaderInfo байтов Я создаю бесконечный цикл, в котором загружается, загружается b, загружает a, загружает b, загружает a, загружает b ... и начинают появляться петли.
НЕ ДЕЛАЙТЕ ЭТОГО!
Это не то, что вам нужно, вы работаете с изображениями, поэтому загрузчик содержимого должен быть Bitmap. Вы можете получить доступ и клонировать bitmapData, если у вас есть разрешение на доступ к пикселям (например, междоменная политика и новый 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
}
}
Это не код ООП, это просто что-то минимальное, чтобы вы могли легко понять:)
Насколько я понимаю, вы хотите создать метод setLoader для своего класса b. что-то вроде
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 (если вы отобразите a, он будет пустым), но вы все равно сможете чтобы получить к нему доступ как с помощью a.loader, так и b.loader.
скажите мне, поможет ли это.