2013-01-01 36 views
1

我有一個外部SWF,我加載到一個加載程序對象。堆疊的對象,這兩個對象都與鼠標

我將此Loader對象作爲子對象添加到MovieClip並將此MovieClip添加到我的舞臺。

我現在想繪製一個透明的矩形Sprite在Loader對象的頂部上,這隻需要捕獲鼠標事件。

(我需要知道什麼時候鼠標滾過並滾出透明層)。

如果你問自己 - 爲什麼我需要這個透明層,而不是僅僅抓住Loader本身的事件?好吧,這有很多原因,其中大部分都與客戶端請求有關,但也是 - 因爲某些外部加載的SWF出於某種原因不響應鼠標事件 - 所以我需要「欺騙」它並在頂部添加我自己的透明圖層。

我的問題是 - 如果我把透明層作爲保持裝載機的MovieClip子,然後我得到這個hirarchy: enter image description here

問題是 - 鼠標事件是由頂抓大多數圖層(透明圖層)並傳遞到MovieClip和舞臺。 事件不會在Loader對象中觸發,因此 - SWF變爲非交互式。

另一種解決方案將是 -

以某種方式添加所述透明層作爲Loader對象的子級,這樣的: enter image description here

那麼事件將被鼓泡到裝載機和SWF 。 問題是 - Loader類不允許你添加子元素(除了加載的SWF)。

所以任何人都可以提供建議,我可以如何在SWF上添加一個透明圖層,並且仍然有鼠標與透明圖層和SWF圖層的交互?

+0

請描述如何構建或組成透明層,它有一個洞還是用alpha值填充0值? – fenixkim

+0

將您的事件捕獲到您放置加載的SWF的「MovieClip」。我看不到透明層的任何需要。 – Gio

+0

@fenixkim - 透明圖層是一個用alpha值填充0的矩形。 –

回答

2

透明圖層阻止加載的swf文件的事件。您需要爲此圖層使用mouseEnabled屬性至false

我不知道這是否適合你,但我認爲這可能會有用。在主swf中添加以下代碼。

import flash.display.Loader; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import fl.transitions.Tween; 
import fl.motion.easing.Linear; 

// Disables the mouse interations 
transparentLayer.mouseEnabled = false; 
// Initialize with alpha 0 
transparentLayer.alpha = 0; 

// Cretes the loader 
var loader:Loader = new Loader(); 
// Listen the complete event 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
// Loads the external swf files 
loader.load(new URLRequest("swf.swf")); 
// Add in the background 
addChildAt(loader, 0); 

// Listen the complete event 
function loadComplete (event:Event) { 
    // Add the mouse events to the loaded content 
    loader.contentLoaderInfo.content.addEventListener(MouseEvent.ROLL_OVER, mouseHandler); 
    loader.contentLoaderInfo.content.addEventListener(MouseEvent.ROLL_OUT, mouseHandler); 
} 

// Handles de mouse events of the loaded swf 
function mouseHandler (event:MouseEvent) 
{ 
    switch (event.type) 
    { 
     case MouseEvent.ROLL_OVER : 
      // Shows the transparentLayer from the current alpha value to 1 in 1 second 
      new Tween(transparentLayer, "alpha", Linear.easeNone, transparentLayer.alpha, 1, 1, true); 
     break; 
     case MouseEvent.ROLL_OUT : 
      // Shows the transparentLayer from the current alpha value to 0 in 1 second 
      new Tween(transparentLayer, "alpha", Linear.easeNone, transparentLayer.alpha, 0, 1, true); 
     break; 
    } 
} 

透明層失去了它的所有元素,所以你需要在外部應用運動效果。在這裏你可以下載運行的項目http://cl.ly/LtfA

+0

感謝您的辛勤工作,幫助我。我不想在透明層上禁用鼠標事件 - 因爲我需要鼠標事件始終在透明層上觸發,因爲我需要知道我什麼時候離開了橫幅。如果我在滾動時禁用透明層上的鼠標事件 - 我將無法知道我何時推出(因爲鼠標事件將被禁用) –

+0

如果頂層是交互式的,底層不能對鼠標做出反應,因爲頂層阻塞了底層的事件。 也許,你可以嘗試監聽頂層的rollOver/out事件,並在其鼠標處理程序中調用底層的公共函數。 – fenixkim