Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация onReleaseOutside (http://www.flasher.ru/forum/showthread.php?t=86312)

MerlinTwi 12.10.2006 14:56

NewMan_by, не понял, как 2 события MOUSE_DOWN ?

artcraft 12.10.2006 15:00

MerlinTwi,

на случай если над stage есть объекты с MOUSE_UP, которые будут перекрывать MOUSE_UP сцены
cчитаю нужным немного добавить:

Код:

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

dynamic public class Test extends Sprite {

        function Test() {
                buttonMode=true;
                addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }
               
        private function onMouseDown(e:Event):void {
                stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp, true);
        }
        private function onMouseUp(e:Event):void {
                stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp, true);
                if (e.target==this) {
                        trace("onRelease");
                } else {
                        trace("onReleaseOutside");
                }
        }
               
}
}

еще могут быть запарки с утягиванием мышки со сцены - тогда листнер onMouseUp не будет удалён и сработает при следующем поднимании мышки над сценой... так что надо повесить на stage листнер для ещё одного события

MerlinTwi 12.10.2006 15:02

artcraft, вроде бы MOUSE_UP срабатывает, если отпускать кнопку мыши за пределами флешки.

artcraft 12.10.2006 15:07

вроде должен, но у меня в FF не всегда

artcraft 12.10.2006 15:15

точнее, если утянуть мышку за пределы браузера и только там поднять кнопку

MerlinTwi 12.10.2006 15:27

artcraft, у меня за пределами браузера тоже срабатывает. Не срабатывает, только если удерживая кнопку мыши переключить фокус на другое приложение.
Кстати, если ловить mouseUp на стадии capture, то событие не срабатывает, если отпускать мышку на пустом месте stage, где нет никаких объектов.

В результате: если добавить проверку на потерю фокуса и необязательно чтобы у кнопки стояло buttonMode=true, то проверка будет выглядеть так:
Код:

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

        dynamic public class Test extends Sprite {
                private var checkMouseUp:Boolean;

                function Test() {
                        addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
                        addEventListener(Event.DEACTIVATE, onDeactivate);
                }
               
                private function mouseDown(e:Event):void {
                        stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
                        checkMouseUp=true;
                }
               
                private function onDeactivate(e:Event):void {
                        if (checkMouseUp) mouseUp(null);
                }
               
                private function mouseUp(e:Event):void {
                        checkMouseUp=false;
                        stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
                        if (e && (e.target==this || contains(e.target))) {
                                trace("onRelease");
                        } else {
                                trace("onReleaseOutside");
                        }
                }
               
        }
}

P.S. Вот и нафига, спрашивается, надо было им убирать событие ReleaseOutside?

NewMan_by 12.10.2006 17:19

Цитата:

Сообщение от MerlinTwi
P.S. Вот и нафига, спрашивается, надо было им убирать событие ReleaseOutside?

Они просто как и мы не знали как это лучше сделать :)

MerlinTwi 19.10.2006 14:43

Кстати, еще стоит учесть, что в методе mouseUp объект может быть уже удален с timeline и stage==null. Поэтому ссылку на stage стоит запомнить в методе mouseDown.

MerlinTwi 30.10.2006 13:25

В дополнение нашего обсуждения, полезный совет от senocular
81. Глобальные события


Часовой пояс GMT +4, время: 07:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.