Форум 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)

NewMan_by 12.10.2006 12:40

Реализация onReleaseOutside
 
Собственно меня интересует ответ на сабж, как сделать это событие в AS3. Если кто-то уже поднимал этот вопрос киньте ссылку, по поиску ничего не нашел.

etc 12.10.2006 13:11

onReleaseOutside() EventHandler
----
flash.display.InteractiveObject dispatches event: mouseUp
----
Replaced in the new event model by a mouseUp event after a call to flash.display.InteractiveObject.setCapture().
----
Topic: ActionScript 2.0 Migration.

MerlinTwi 12.10.2006 14:02

InteractiveObject.setCapture убрали.
Можно так:
Код:

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);
                }
                private function onMouseUp(e:Event):void {
                        stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        if (e.target==this) {
                                trace("onRelease");
                        } else {
                                trace("onReleaseOutside");
                        }
                }
               
        }
}


NewMan_by 12.10.2006 14:13

может я что-то не догоняю, но что это за flash.display.InteractiveObject и как его использовать?

Nirth 12.10.2006 14:21

Это базовый класс для DisplayObjectContaiener который в свою очередь базовый для Sprite. ну а Sprite базовый для MovieClip

etc 12.10.2006 14:26

MerlinTwi, это в хелпе Flex 2 8)

NewMan_by 12.10.2006 14:29

MerlinTwi попробовал не работает, то есть когда за пределами клипа не срабатывает событие, хотя вроде должно.

MerlinTwi 12.10.2006 14:33

__etc, старый хелп, пора обновить :)
см. livedocs.macromedia.com коммент от Jul 25, 2006 at 6:49 PM

NewMan_by 12.10.2006 14:33

UPD
Работает со stage. В общем со stage фактически как использовать parent, то есть не совсем хороший способ

NewMan_by 12.10.2006 14:40

То если есть вложенность и когда я нажимаю на объект, срабатывает 2 события MOUSE_DOWN и что тогда?

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, время: 06:59.

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