|
|
|||||
стервочка (я мужик)
|
Ловля события mouseLeave
Вот написал класс, который генерит события у Stage, если мышка его покинула или вернулась.
Может конечно коряво, поэтому прошу внести корективы, если у кого-то есть замечания. ASdocs недописаны так ... набросал ... package game.utils { import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; public final class StageUtils { public static function registerEvents(stage:Stage):void { _stage = stage; _stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveEventHandler); _stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler); // при создании сразу диспатчим событие if ( _stage.mouseX <= 0 || _stage.mouseX >= _stage.stageWidth || _stage.mouseY <= 0 || _stage.mouseY >= _stage.stageHeight ) { dispatchStageMouseOutEvent(); // если мы уже находимся за пределами, надо назначить новое событие _stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); } else { dispatchStageMouseOverEvent(); } } public static function unRegisterEvents(stage:Stage):void { _stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler); _stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); _stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); _stage.removeEventListener(Event.MOUSE_LEAVE, mouseLeaveEventHandler); } //-------------------------------------------------------------------------- // // Class variables // //-------------------------------------------------------------------------- /** * @private * Нужно ли удалить листенер при возвращениии мышки в окно? */ private static var _removeMouseMove:Boolean; /** * @private * Наш стэйдж храним тут. */ private static var _stage:Stage; //-------------------------------------------------------------------------- // // Class properties // //-------------------------------------------------------------------------- /** * @private */ private static var _stageLeave:Boolean; public function get stageLeave():Boolean { return _stageLeave } //-------------------------------------------------------------------------- // // Private class methods // //-------------------------------------------------------------------------- /** * @private * Диспатчим событие выхода за пределы. */ private static function dispatchStageMouseOutEvent():void { if (_stageLeave) return; _stageLeave = true; _stage.dispatchEvent(new Event("stageMouseOut")); // trace("mouseOut"); } /** * @private * Диспатчим событие входа обратно. */ private static function dispatchStageMouseOverEvent():void { if (!_stageLeave) return; _stageLeave = false; _stage.dispatchEvent(new Event("stageMouseOver")); // trace("mouseIn"); } //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * @private * Нажали мышку. Обработчик выбегания за границу срабатывает только по отпусканию мыши, * поэтому устанавливаем слежение за движением мыши и удаляем обработчик. */ private static function mouseDownEventHandler(event:MouseEvent):void { event _stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); _stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); } /** * @private * Отпустили мышку. Удалим всякую фигню. */ private static function mouseUpEventHandler(event:MouseEvent):void { _stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); _stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); } /** * @private * Двигаем мышкой. * Обрабатываем, когда мышка уже за пределами, или нажата. */ private static function mouseMoveEventHandler(event:MouseEvent):void { var stageLeave:Boolean = ( event.stageX <= 0 || event.stageX >= _stage.stageWidth || event.stageY <= 0 || event.stageY >= _stage.stageHeight ); if (!_stageLeave && stageLeave) { dispatchStageMouseOutEvent(); } else if (_stageLeave && !stageLeave) { if (_removeMouseMove) { _stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); _removeMouseMove = false; } dispatchStageMouseOverEvent(); } } /** * @private * Мышка вышла за пределы. */ private static function mouseLeaveEventHandler(event:Event):void { dispatchStageMouseOutEvent(); // вышли за грницы. надо как-то отследить что мы вернулись _stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); } } } Последний раз редактировалось BlooDHounD; 24.01.2007 в 16:36. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Раз уж, просил замечания
Цитата:
Названия событий стоило бы объявить константами в классе. Не генерится событие в случае переключения по Alt-tab, хотя это можно отловить по Event.DEACTIVATE, рекомендую добавить. |
|
|||||
стервочка (я мужик)
|
Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось BlooDHounD; 25.01.2007 в 13:18. |
Часовой пояс GMT +4, время: 12:51. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|