堆叠的对象,它们都与鼠标交互

时间:2013-01-01 11:23:54

标签: actionscript-3 mouseevent layer

我有一个外部SWF ,我加载到 Loader 对象。

我将这个Loader对象作为子项添加到MovieClip中,并将此MovieClip添加到我的舞台上。

我现在想要在Loader对象的顶部上绘制一个透明矩形Sprite,这只是捕获鼠标事件所必需的。

(我需要知道鼠标何时滚动并从透明层中滚出)。

如果你问自己 - 为什么我需要这个透明层而不仅仅是抓住Loader本身的事件?好吧,这有很多原因,其中大部分都与客户端请求有关,但是 - 因为某些外部加载的SWF由于某种原因没有响应鼠标事件 - 所以我需要“欺骗”它并在顶部添加我自己的透明图层。

我的问题是 - 如果我把透明层作为持有Loader的MovieClip的子节点,那么我得到这个hirarchy: enter image description here

问题是 - 鼠标事件被最顶层(透明层)捕获并传递给MovieClip和舞台。 事件不会在Loader对象中触发,因此 - SWF变为非交互式。

另一个解决方案是 -

以某种方式将透明层添加为Loader对象的子级,如下所示: enter image description here

然后事件将冒泡到Loader和SWF。 问题是 - Loader类不允许您向其添加子元素(加载的SWF除外)。

那么有人可以提供建议我如何在SWF顶部添加透明层,并且仍然可以与透明层和SWF层进行鼠标交互?

1 个答案:

答案 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

的项目