Вы предварительно загружаете, потому что ваш SWF расположен на веб-сервере? Если это так, одним из вариантов было бы предварительно загрузить байты с сервера, фактически не интерпретируя их, используя URLLoader. Затем, когда вам нужно отобразить MovieClip, введите предварительно загруженные байты (URLLoader.data) в загрузчик, используя Loader.loadBytes, чтобы фактически создать экземпляр MovieClip (и начать воспроизведение, звук и все). Может быть небольшое отставание во время создания экземпляра, но это будет намного меньше, чем без предварительного загрузчика.
За свой вопрос о типе Loader.content:
package
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
public class tst extends Sprite
{
[Embed(source="any_image.png", mimeType="application/octet-stream")]
private var img_bytes:Class;
[Embed(source="any_swf.swf", mimeType="application/octet-stream")]
private var swf_bytes:Class;
public function tst():void
{
var b1:ByteArray = new img_bytes();
var l1:Loader = new Loader();
l1.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace(getQualifiedClassName(l1.content));
trace(l1.content is Bitmap);
});
l1.loadBytes(b1);
var b2:ByteArray = new swf_bytes();
var l2:Loader = new Loader();
l2.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace(getQualifiedClassName(l2.content));
trace(l2.content is MovieClip);
});
l2.loadBytes(b2);
}
}
}
(Примечание: это просто показательный код - НЕ добавлять обработчики событий с закрытием функции, как это, это приведет к памяти утечки. Я также пропускаю URLLoader и просто встраиваю, чтобы получить свои байты, но они одинаковые байты в любом случае).
И выход:
flash.display::Bitmap
true
test_fla::MainTimeline
true
Однако, Bitmap и MovieClip не единственные варианты Loader.content - Загрузка SWF скомпилированной из кода может быть получен из Sprite и может показать полный класс имя, хотя, как указывает www0z0k, все они получены из DisplayObject. Хотя я считаю, что любой SWF-выход из Flash Professional всегда происходит из MovieClip.
За записной что Загрузчик байт всегда MovieClips
Оказывается, вы правы - это загрузчик, который загружает регулярное старое изображение, свойство contentLoaderInfo.bytes содержит байты для генерируемого SWF, который простая обложка MovieClip с изображением в качестве Ребенка. Кто бы догадался ?!
var l3:Loader = new Loader();
l3.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace("- l3:");
trace(getQualifiedClassName(l3.content));
trace(l3.content is Bitmap);
// This ByteArray is a SWF!
var b3:ByteArray = l3.contentLoaderInfo.bytes;
var l4:Loader = new Loader();
l4.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace("- l4:");
trace(getQualifiedClassName(l4.content));
trace(l4.content is Bitmap);
trace(Object(l4.content).getChildAt(0) is Bitmap);
});
l4.loadBytes(b3);
addChild(l4);
});
l3.load(new URLRequest("any_image.png"));
Выход:
- l3:
flash.display::Bitmap
true
- l4:
flash.display::MovieClip
false
true
Это именно та вещь, что я искал. –
Связанная проблема: если я действительно не загружаю объект, то каков наилучший способ определить, должен ли он быть образом? В прошлом я заметил, что загрузка массива байтов данных изображения создает клип. –
Я не уверен, что я точно понимаю ваш вопрос, но после использования Loader.loadBytes вы получите Event.COMPLETE, в это время Loader.контент должен быть либо Bitmap (если байты были JPEG или PNG, например), так и MovieClip (если байты были SWF), поэтому вы знали бы, сможете ли вы взаимодействовать с ним (останавливаться/играть) или нет. –