我试图在现有的SWF中添加一个MovieClip-注入一个小代码,它可以执行以下操作:
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操作。
我无法在所有元素中添加事件处理程序。
有什么想法吗?
听容器movieclip自己的stage(包含FLOOR的movieclimp)上的点击。在点击事件的处理程序方法中,使用hitTestPoint对容器movieclip的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
}
}
}
要在不知道哪些对象可以提前点击的情况下构建exceptArray:(未经测试,但应该足够近,可以给你一个想法)
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)将只向movieclip的stage添加一次单击,而不向其子级添加。。
在as3中,所有的movieclip都有一个stage属性。如果你在主时间线上写了this.stage.addEventListener(MouseEvent.CLICK,onClick)这将为整个swf添加一个stage点击。但是,如果您编写了类似myMC.sstage.addEventListener(MouseEvent.CLICK,onClick)的内容它只会为该电影的舞台(myMC的舞台)添加一次点击。由于舞台在显示列表下方,您可以在任何电影剪辑中捕捉到点击。如果您不能提前访问所有具有鼠标事件的对象,则可以循环遍历容器的所有子对象,并使用.hasEventListener(mouseEvent.CLICK)检查它们是否具有mouseEvent,从中创建您的exceptArray,然后使用上面相同的逻辑来忽略exceptArray中的项。