2012-04-23 106 views
2

我正在AS3中編寫一個程序,並且要預先加載將來需要的影片剪輯。不幸的是,我遇到了一個問題:電影剪輯一載入就會播放聲音(在將它們添加到舞臺之前)。我如何靜靜地預加載有聲音的影片剪輯?

加載後立即停止影片剪輯差不多解決了這個問題,但有時我仍然聽到剪輯的開始。顯然,剪輯不會等待完成的事件處理程序在開始之前完成...?

// example of stopping a clip after it is loaded 
// sound may still be heard for a moment 
var loader: Loader = new Loader(); 
loader.addEventListener(Event.COMPLETE, function(e : *) : void { 
    (loader.contentLoaderInfo.content as MovieClip).stop(); 
}); 
loader.load("a_loud_movie_clip.swf"); 

我也考慮靜音一切,而加載的剪輯,但這個地方一個相當嚴重的約束與尊重程序的其他部分時,聲音可以發揮到。

有沒有解決這個問題的標準方案?我覺得這應該是一個非常普遍的問題。

回答

3

因爲您的SWF位於Web服務器上,您是否預加載?如果是這樣,則一種選擇是從服務器預加載字節,而不使用URLLoader實際解釋它們。然後,當您需要顯示MovieClip時,使用Loader.loadBytes將預加載的字節(URLLoader.data)注入Loader以實際實例化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 

然而,位圖和影片剪輯是不是loader.content唯一的選擇 - 從加載代碼編譯的SWF可以從雪碧中導出,並且可以顯示完整的類名稱,儘管www0z0k指出,它們都是從DisplayObject派生的。儘管我相信Flash Professional的任何SWF輸出都始自MovieClip。

根據您的注意,裝載機字節始終是影片剪輯

事實證明你是對的 - 加載一個普通的舊圖像的加載器,contentLoaderInfo.bytes屬性包含生成的SWF是字節一個簡單的MovieClip包裝器,其圖像爲Child。誰會猜到?!

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 
+0

這正是諸如此類的事情,我一直在尋找。 – 2012-04-23 18:20:12

+0

相關問題:如果我實際上沒有加載對象,那麼確定它是否應該是圖像的最佳方法是什麼?我注意到過去加載一個圖像數據的字節數組會產生一個影片剪輯。 – 2012-04-23 18:23:56

+0

我不確定我是否完全理解你的問題,但是你在使用Loader.loadBytes後會得到一個Event.COMPLETE,在這個時候Loader。內容應該是位圖(例如,如果字節是JPEG或PNG)或MovieClip(如果字節是SWF),那麼您應該知道您是否可以與它進行交互(停止/播放)。 – 2012-04-23 20:31:48