祝新年快乐!
我想将事件处理与容器及其子容器分开。如您所见,我的源代码非常简单:
package {
import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
public class test extends Sprite{
public function test() {
var container:Sprite = new Sprite(); // my container
container.graphics.beginFill(0, 1); // whatever the color
container.graphics.drawRect(0, 0, 100, 100); // origin at 0,0
container.graphics.endFill();
addChild(container);
var decor:Sprite = new Sprite(); // and it child
decor.graphics.beginFill(0, 1); // whatever the color
decor.graphics.drawRect(200, 200, 100, 100); // origin at 200,200
decor.graphics.endFill();
container.addChild(decor);
container.mouseChildren = false;
container.addEventListener(MouseEvent.ROLL_OVER, onOver, false, 0, true);
}
private function onOver(e: MouseEvent):void {
trace("ROLL trace");
}
}
}
当我翻转容器对象时,我已经找到了跟踪(对我而言)。 但是当我翻过装饰物时,我也得到了痕迹(不是我想要的)。 我只是希望容器由鼠标事件触发,而不是孩子。 那么我的mouseChildren = false发生了什么?我不明白......
答案 0 :(得分:4)
decor
对象是container
的成员,因此会与container
中的任何其他内容一起进行评估。
mouseChildren = false;
不是完全禁用鼠标事件的方法,而是为了降低复合显示对象中的复杂性:仍然会触发鼠标事件,但事件的target
属性不包含对该事件的引用实际滚动的鼠标对象,但仅限于设置该属性的父对象。
如果您希望完全忽略decor
,请改用decor.mouseEnabled = false;
。
答案 1 :(得分:1)
我尝试过mouseEnabled = false,但它也没有用。 在另一个论坛上,一个人告诉我'a filled object within container will trigger the event handler'。 因此,他的解决方案是拥有容器,并创建2个子项:一个处理鼠标事件,另一个作为装饰。
它运作良好。