4

顺便说一句,新年快乐!

我想将事件处理与容器及其子项分开。如您所见,我的源代码非常简单:

    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 怎么了……?我不明白...

4

2 回答 2

4

decor对象是 的成员container,因此它与 中的任何其他内容一起被评估container

mouseChildren = false;不是完全禁用鼠标事件的方法,而是降低复合显示对象的复杂性:仍然会触发鼠标事件,但该事件的target属性将不包含对鼠标实际滚动的子对象的引用,而仅包含对父对象的引用该属性已设置。

如果您想decor被完全忽略,请decor.mouseEnabled = false;改用。

于 2012-01-03T01:41:29.803 回答
1

我试过mouseEnabled = false,它也不起作用。在另一个论坛上,一个人告诉我“容器内的填充对象将触发事件处理程序”。所以他的解决方案是拥有容器,并创建 2 个孩子:一个处理鼠标事件,另一个作为装饰。

它运行良好。

于 2012-01-03T08:28:27.970 回答