【问题标题】:flash as3 mouseChildren issueflash as3 mouse儿童问题
【发布时间】:2011-11-28 19:00:49
【问题描述】:

我有一个正在绘制并添加到舞台的剪辑,当单击它时,它会将自身的两个副本添加为子项。我希望这些孩子可以点击,但问题是,如果他们被点击,它会将点击注册为父点击及其子点击。因此,它不是添加两个新剪辑,而是添加 4。我可以通过将 mouseChildren = false 添加到movieClip来解决这个问题,但是当我这样做时,新剪辑是从父剪辑的中心绘制的,而不是从单击的剪辑的来源。我该如何解决这个问题?这是我的代码:

function clickCircle(e:MouseEvent):void {
    var thisCircle = e.target;
    for (var i=0; i<thisCircle.childCircles;i++){
        trace('drawCircle' + i);
        drawCircle(thisCircle);
    }
}

function drawCircle(parentCircle){

    //trace('draw circle' + childCircles);
    var xPos;
    var yPos;
    if (circleCount == 0){
        xPos = centerStageX;
        yPos = centerStageY;
    } else {
        //xPos = parentCircle.x;
        //yPos = parentCircle.y;
        xPos = yPos = 0;
    }

    var newCircle:Shape = new Shape();
    newCircle.graphics.beginFill(circleColor);
    newCircle.graphics.drawCircle(0,0,cr); //x, y, radius
    newCircle.graphics.endFill();

    var circleClip:MovieClip = new MovieClip();
    //circleClip.mouseChildren = false;
    circleClip.childCircles = numCircles;
    circleClip.x = xPos;
    circleClip.y = yPos;
    circleClip.addChild(newCircle);
    circleClip.id = circleCount;
    if (circleCount == 0){
        addChild(circleClip);
    } else {
        parentCircle.addChild(circleClip);
    }

    circleArray.push(circleClip);
    circleClip.addEventListener(MouseEvent.CLICK,clickCircle);
    if (circleCount != 0){
        moveCircle(parentCircle,circleClip,xPos,yPos);
    }
    circleCount++;
}

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    事件侦听器只注册到一个对象,但它从其子对象接收click 事件,因为 MouseEvents 在显示列表中冒泡(即它们在层次结构中向上转发),因此每个相应的父对象都会接收事件,甚至是舞台。

    要阻止这种情况发生,您必须明确停止事件的传播。 ActionScript 事件有两种方法:

    stopPropagation

    ==> 阻止事件在以后的执行节点中被接收(即其他对象在 currentTarget 之后,但允许同一对象中的其他侦听器触发。

    stopImmediatePropagation

    ==> 在收到事件的那一刻停止事件,无论其他谁在监听。

    除非您要执行代码之外的其他操作,否则这两种操作都应该可以正常工作。因此,在您的 clickCircle 处理程序中,添加一行:

    function clickCircle(e:MouseEvent):void {
    
        // --- This should stop the event from bubbling up in the display list
        e.stopPropagation();
    
        var thisCircle = e.target;
    

    【讨论】:

    • 附加说明:您应该考虑将此代码包装到 MyCircle 类中 - 我将使用基于时间线的 ActionScript 限制为简单的 stop() 或 gotoAndPlay() 类型的程序。如果您打算使用 ActionScript 进行更多工作,请查看本教程:adobe.com/devnet/flash/quickstart/creating_class_as3.html 或此视频:adobe.com/devnet/flash/articles/first_as3_class.html
    • 谢谢 - 会的。是的 - 这开始只是一种实验,但它开始变得有点广泛,所以我要回去重构和重组代码。我以前从未见过 stopPropagation 方法,这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多