Событие клика за пределами MovieClip в AS3 - PullRequest
0 голосов
/ 30 сентября 2011

Есть ли способ определить, щелкнул ли пользователь за пределами мувиклипа?

Например, мне нужно обнаружить его, чтобы закрыть ранее открытое меню (например, стиль строки меню: Файл, Издание, Инструменты, Справка и т. Д.).

enter image description here

Как я могу обнаружить такое событие? Спасибо!

Ответы [ 5 ]

5 голосов
/ 30 сентября 2011

Добавьте слушателя на сцену и проверьте, является ли stage целью события.

Пример кода здесь: http://wonderfl.net/c/eFao

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class FlashTest extends Sprite
    {

        private var _menu : Sprite;

        public function FlashTest()
        {
            _menu = new Sprite();
            _menu.x = 100;
            _menu.y = 100;
            _menu.alpha = 0.5;

            with(_menu.graphics)
            {
                beginFill(0xFF0000, 1);
                drawRect(0, 0, 300, 300);
                endFill();
            }

            addChild(_menu);

            _menu.addEventListener(MouseEvent.CLICK, onClickHandler);
            stage.addEventListener(MouseEvent.CLICK, onClickHandler);

        }

        private function onClickHandler(event : MouseEvent) : void
        {
            switch(event.target)
            {
                case _menu:
                    _menu.alpha = 0.5;
                    break;

                case stage:
                    _menu.alpha = 1;
                    break;
            }

        }

    }

}
3 голосов
/ 30 сентября 2011

Вы можете добавить прослушиватель к событию click корневого элемента:

MovieClip(root).addEventListener(MouseEvent.CLICK, clickObject);

, затем в функции clickObject вы можете проверить, что вы нажимаете.

function clickObject(e:Event):void
{
    var hoverArray:Array = MovieClip(root).getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY));
    var hoverOverObject:* = hoverArray[hoverArray.length - 1];
}

hoverOverObject ссылается на элемент, на который вы нажимаете.Часто это будет форма внутри мувиклипа, поэтому вам нужно посмотреть на его родительский фрагмент, а затем сравнить его с вашим мувиклипом.Если щелчок не был в выпадающем клипе, активируйте закрытие.

1 голос
/ 27 сентября 2013

Использовать фазу захвата:

button.addEventListener(MouseEvent.CLICK, button_mouseClickHandler);
button.stage.addEventListener(MouseEvent.CLICK, stage_mouseClickHandler, true);
//...

private function button_mouseClickHandler(event:MouseEvent):void
{
    trace("Button CLICK");
}
private function stage_mouseClickHandler(event:MouseEvent):void
{
    if (event.target == button)
        return;
    trace("Button CLICK_OUTSIDE");
}

Обратите внимание, что использование stopPropagation () подходит для одного объекта, но не для нескольких.Этот подход хорошо работает для меня.

1 голос
/ 01 октября 2011
var container:MovieClip = new MovieClip();
var mc:MovieClip = new MovieClip();
with(mc.graphics){
    beginFill(0xff0000,1);
    drawCircle(0,0,30);
    endFill();
}
mc.name = "my_mc";
container.addChild(mc);
addChild(container);
stage.addEventListener(MouseEvent.CLICK, action);
function action (e:MouseEvent):void 
{
    if(e.target.name != "my_mc"){
        if(container.numChildren != 0)
        {
            container.removeChild(container.getChildByName("my_mc"));
        }
    }
}
0 голосов
/ 04 августа 2013

Используйте этап и прослушиватель щелчков спрайта (меню), при этом сначала выполняется прослушиватель спрайтов и примените метод stopPropagation () к обработчику щелчков спрайта.Например:

menu.addEventListener(MouseEvent.CLICK, handleMenuClick);
stage.addEventListener(MouseEvent.CLICK, handleStageClick);

private function handleMenuClick(e:MouseEvent):void{
    // stop the event from propagating up to the stage
    // so handleStageClick is never executed.
    e.stopPropagation();
    // note that stopPropagation() still allows the event
    // to propagate to all children so if there are children
    // within the menu overlay that need to respond to click
    // events that still works.  
}

private function handleStageClick(e:MouseEvent):void{
    // put hide or destroy code here
}

Идея состоит в том, что щелчок мыши в любом месте создает одно событие MouseEvent.CLICK, которое всплывает со сцены, проходит через всех дочерних элементов к цели, а затем обратно через родительских элементов целиНа сцену.Здесь мы прерываем этот цикл, когда целью является наложение меню, не позволяя событию распространяться обратно до родительской стадии, гарантируя, что метод handleStageClick () никогда не вызывается.Хорошая вещь об этом подходе - то, что он является полностью общим.Под слоем наложения может быть много дочерних элементов, а наложение может иметь своих собственных дочерних элементов, которые могут реагировать на щелчки, и все это работает.

...