Actionscript 3 与鼠标交互的堆叠对象

Actionscript 3 与鼠标交互的堆叠对象,actionscript-3,mouseevent,layer,Actionscript 3,Mouseevent,Layer,我有一个外部SWF,我将其加载到一个加载程序对象中 我将此加载程序对象作为子对象添加到MovieClip,并将此MovieClip添加到我的舞台 现在我想在Loader对象的顶部绘制一个透明的矩形精灵,它只是捕捉鼠标事件所需要的 (我需要知道鼠标何时翻滚出透明层) 如果你问自己-为什么我需要这个透明层,而不是仅仅捕获加载器本身上的事件?好吧,这有很多原因,其中大部分都与客户端请求有关,但也-因为一些外部加载的主权财富基金出于某种原因不响应鼠标事件-所以我需要“欺骗”它,并在上面添加我自己的透明

我有一个外部SWF,我将其加载到一个加载程序对象中

我将此加载程序对象作为子对象添加到MovieClip,并将此MovieClip添加到我的舞台

现在我想在Loader对象的顶部绘制一个透明的矩形精灵,它只是捕捉鼠标事件所需要的

(我需要知道鼠标何时翻滚出透明层)

如果你问自己-为什么我需要这个透明层,而不是仅仅捕获加载器本身上的事件?好吧,这有很多原因,其中大部分都与客户端请求有关,但也-因为一些外部加载的主权财富基金出于某种原因不响应鼠标事件-所以我需要“欺骗”它,并在上面添加我自己的透明层

我的问题是- 如果我将透明层作为MovieClip的子对象,该子对象包含加载程序,那么我会得到以下结果:

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

另一个解决办法是:

以某种方式将透明层添加为加载程序对象的子对象,如下所示:

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


那么,有人能给我提供建议吗?我如何在SWF上面添加一个透明层,并且仍然可以与透明层和SWF层进行鼠标交互?

透明层正在阻止加载的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;
    }
}

透明层丢失了所有的交互,因此需要在外部应用运动效果。在这里您可以下载正在运行的项目

请描述透明层是如何构建或组成的,它有一个洞或是一个0值的alpha填充?在您将加载的SWF放入的
MovieClip
上捕捉您的事件。我看不出透明层有什么需要。@fenixkim-透明层是一个用0值填充alpha的矩形。@Gio-我需要一个单独的层,因为我将SWF加载到一个MovieClip中,然后添加一些遮罩,使MovieClip的实际大小略大于实际的SWF大小(宽度和高度)。所以-我不想让额外的区域捕捉到我的“翻滚”和“翻滚”事件,所以我需要在MovieClip容器的顶部添加一层,这是SWF的尺寸(没有额外的遮罩尺寸)-这样它就可以捕捉到我的“翻滚”事件。当这种情况发生时,我将关闭遮罩,并显示整个SWF。然后我可以捕捉SWF本身的“ROLL_OUT”事件。然后我建议您将加载的SWF放入透明的
Sprite
中,并在该透明层上启用
mouseChidlen
。这样你就可以同时观看SWF和Sprite的比赛。我建议的架构与您的第二个架构类似,除了SWF和透明的
Sprite
swap places。感谢您的辛勤工作。我不想禁用透明层上的鼠标事件-因为我需要鼠标事件始终在透明层上激发,因为我需要知道何时我推出横幅。如果我在进入透明层时禁用透明层上的鼠标事件-我将无法知道何时退出(因为鼠标事件将被禁用),这是一个遗憾,如果顶层是交互式的,底层无法对鼠标做出反应,因为顶层正在阻止底层的事件。也许,您可以尝试侦听顶层的滚动/退出事件,并在其鼠标处理程序中调用底层的公共函数。