2013-01-01 31 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