0

我尝试动态添加一个 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”元素,使用类似冒泡事件的方法。

当然,我可以在任何元素之上添加 FLOOR,但我有一些带有点击处理程序的元素。我不能忽略所有的元素。所以我的问题是:

如果我单击带有单击处理程序的 MovieClip,请执行原始操作。如果我在没有单击处理程序的情况下单击 MovieClip,请执行 FLOOR 操作。

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

任何想法?

4

1 回答 1

0

聆听对容器影片剪辑自己的舞台(包含 FLOOR 的影片剪辑)的点击。在单击事件的处理程序方法中,使用 hitTestPoint 和容器动画剪辑的 mouseX 和 MouseY 进行命中测试,如果鼠标悬停在任何可单击对象上,则忽略舞台单击。将所有可点击的对象存储在一个数组中以进行该测试。

这段代码未经测试,但它会是这样的:

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
        }
    }
}

在不知道哪些对象可以提前点击的情况下构建exemptArray:(未经测试,但应该足够接近给你一个想法)。

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:
}

编辑以在评论中回答问题:

this.addEventListener(MouseEvent.CLICK, onClick)将为整个对象添加一个点击事件,包括子对象。

this.stage.addEventListener(MouseEvent.CLICK, onClick)只会将点击添加到影片剪辑的舞台,而不是其子级。

在 as3 中,所有的movieclips 都有一个stage 属性。如果你在主时间线上写this.stage.addEventListener(MouseEvent.CLICK, onClick); 这将在整个 swf 中添加一个舞台点击。但是,如果你写了类似myMC.stage.addEventListener(MouseEvent.CLICK, onClick); 它只会向该影片剪辑的舞台(myMC 的舞台)添加一次点击。由于舞台位于显示列表下方,因此您可以在任何影片剪辑中捕捉点击。如果您无法提前访问所有具有鼠标事件的对象,则可以循环遍历所有容器的子对象,并使用.hasEventListener(MouseEvent.CLICK); 检查它们是否具有 mouseEvent;,从中创建您的 excludeArray,然后使用上述相同的逻辑来忽略 excludeArray 中的项目。

于 2012-11-15T18:55:29.623 回答