Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 swf中的气泡单击事件_Actionscript 3_Flash_Event Handling - Fatal编程技术网

Actionscript 3 swf中的气泡单击事件

Actionscript 3 swf中的气泡单击事件,actionscript-3,flash,event-handling,Actionscript 3,Flash,Event Handling,我尝试动态地将MovieClip添加到现有的SWF中-注入一个小代码,执行以下操作: this.obj = new MovieClip(); // it is inside an object obj.name = 'FLOOR'; obj.graphics.beginFill(0xFFFFFF, 0); obj.graphics.drawRect(0,0,self.width, self.height); obj.graphics.endFill(); obj.buttonMode = tru

我尝试动态地将MovieClip添加到现有的SWF中-注入一个小代码,执行以下操作:

this.obj = new MovieClip(); // it is inside an object
obj.name = 'FLOOR';
obj.graphics.beginFill(0xFFFFFF, 0);
obj.graphics.drawRect(0,0,self.width, self.height);
obj.graphics.endFill();
obj.buttonMode = true;
self.addChildAt( floorLayerMC , 0); /* self is an reference for the this keyword, reference for the entire swf */
我的问题是:这个SWF有很多元素,比如图像和文本字段,其中一些元素没有用于单击的事件处理程序。我需要找到一种方法将所有事件“重定向”到我的“FLOOR”元素,使用类似于冒泡事件的方法

当然,我可以在任何元素的顶部添加地板,但我有一些元素带有click handler。我不能忽视所有的因素。所以我的问题是:

如果我使用click handler在MovieClip上单击,则执行原始操作。 如果我在没有单击处理程序的情况下单击MovieClip,请执行地板操作

我无法在所有元素中添加事件处理程序


有什么想法吗?

听一下容器movieclip自己的舞台(包含地板的movieclip)上的点击。在click事件的handler方法中,使用hitTestPoint对容器movieclip的mouseX和MouseY执行命中测试,如果鼠标位于任何可单击的对象上,则忽略stage click。将所有可单击的对象存储在一个数组中以执行该测试

此代码未经测试,但其运行方式如下:

var exemptArray:Array = [ btn_mc1, btn_mc2, btn_mc3 ];
containerMC.stage.addEventListener(MouseEvent.CLICK, onClickMyMC);

function onClickMyMC( event:Event ):void
{
    for(var i:int = 0; i < exemptArray.length; i++)
    {
        if( exemptArray[i].hitTestPoint(containerMC.mouseX, containerMC.mouseY) )
        {
            // do nothing, ignore the stage click ( and let the object with the click respond )
            break;
        }
        else
        {
            // respond to the stage click
        }
    }
}
var-exemptArray:Array=[btn_-mc1,btn_-mc2,btn_-mc3];
containerMC.stage.addEventListener(MouseEvent.CLICK,onClickMyMC);
函数onClickMyMC(事件:事件):void
{
for(变量i:int=0;i
要在不知道哪些对象可提前单击的情况下构建ExcemptArray: (未经测试,但应足够接近,以给您一个想法)。

var exemptArray:Array = buildExemptArray();

function buildExemptArray():Array
{
    var arr:Array = [];

    for(var j:int = 0; j < containerMC.numChildren; j++)
    {
        if( containerMC.getChildAt(i).hasEventListener(MouseEvent.CLICK) )
        {
            arr.push( containerMC.getChildAt(i) );
        }
    }

     return arr:
}
var-exemptArray:Array=buildExemptArray();
函数buildExemptArray():数组
{
var-arr:Array=[];
for(var j:int=0;j
编辑以回答评论中的问题:

此.addEventListener(MouseEvent.CLICK,onClick)将向整个对象添加一个单击事件,包括子对象

此.stage.addEventListener(MouseEvent.CLICK,onClick)将只向movieclip的stage添加单击,也不会向其子级添加单击


在as3中,所有电影剪辑都具有舞台属性。如果您在主时间轴this.stage.addEventListener(MouseEvent.CLICK,onClick)上写了内容这将为整个swf添加一个舞台点击。但是,如果您编写了类似于myMC.stage.addEventListener(MouseEvent.CLICK,onClick)的东西
它只会在movieclip的舞台(myMC的舞台)上添加一次点击。由于stage位于显示列表的下方,因此您可以在任何movieclip中捕获单击。如果您不能提前访问所有具有鼠标事件的对象,则可以遍历容器的所有子对象,并使用.haseEventListener(mouseEvent.CLICK)检查它们是否具有mouseEvent,从中创建您的exemptArray,然后使用上面相同的逻辑忽略exemptArray中的项目。

您有权访问SWF源吗?当然,但我不能更改或破坏某些现有行为(如某些动画)。您可以做的是更改该SWF中现有的单击侦听器以使用捕获阶段(或以更高优先级侦听),然后在他们完成任务后停止传播。然后在容器/主应用程序中,以通常的冒泡阶段(或以较低优先级)侦听。然后,如果该事件的侦听器已经存在,它将在处理后被取消,而您更广泛的侦听器将无法运行哇…这是一个好主意,但我无法控制movieclips的列表。我正在考虑以更干净的方式使用onClickMyMC,作为我的发言,并添加一个事件。stopPropagation()在我可以控制和推广的所有movieclip中,关于在任何movieclip中添加类似代码的规则。这两者之间的区别是什么:this.addEventListener和this.stage.addEventListener?(这代表整个swf)。