|
|
|
|||||
Непостоянство MOUSE_LEAVE
Всем привет.
Мне нужно ловить событие, когда курсор выходит за пределы окна проектора. Использую MOUSE_LEAVE. Все нормально работает до тех пор, пока я в своем приложении не переключусь в полноэкранный режим и потом обратно. После этого MOUSE_LEAVE перестает срабатывать. Но стоит изменить размер окна мышкой, MOUSE_LEAVE снова в деле... Кто нибудь сталкивался с этим? Глюк? Компилирую через FlashBuilder. Mac OS 10.9.5 Подробно о том, что делаю: В программе есть менюшка, которая должна появляться при активности мыши (но только когда мышь находится в пределах окна программы). И при простое - скрываться вместе с курсором. Кстати, в конструкторе Mouse.hide тоже почему-то не срабатывает - только после первого MOUSE_OVER.. Очень странно.. public class MainMenu extends MainMenuSWC { private var _timerIdle:Timer; public function MainMenu() { visible = false; Mouse.hide(); if (stage) initMonitoringMouseMove(); else addEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); } private function initMonitoringMouseMove(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeaveHandler); stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); _timerIdle = new Timer(2000); _timerIdle.addEventListener(TimerEvent.TIMER, onTimerIdleCompleteHandler); onMouseOverHandler(); } private function onMouseOverHandler(e:MouseEvent = null):void { stage.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); } private function onMouseLeaveHandler(e:Event):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); } private function onMouseMoveHandler(e:MouseEvent):void { visible = true; Mouse.show(); _timerIdle.delay = 2000; _timerIdle.start(); } private function onTimerIdleCompleteHandler(e:TimerEvent):void { _timerIdle.stop(); visible = false; Mouse.hide(); } public function destroy():void { removeEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); if (stage) { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); stage.removeEventListener(Event.MOUSE_LEAVE, onMouseLeaveHandler); } if (_timerIdle) { _timerIdle.stop(); _timerIdle.removeEventListener(TimerEvent.TIMER, onTimerIdleCompleteHandler); } } }
__________________
кто не отвечает, того garbage collector забирает Последний раз редактировалось djken; 07.04.2017 в 16:01. Причина: добавление листинга |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Mouse.hide() у меня работает сразу в конструкторе. Stage нельзя подписать на MOUSE_OVER.
|
|
|||||
Mouse.hide() то работает. Но если курсор находится над окном плеера во время запуска, то он не скрывается. Передвигаю курсор с окна и снова навожу - после этого работает как и задумано..
Цитата:
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Сам stage не реагирует на MOUSE_OVER. Его дети в дисплей-листе реагируют.
Вот немного переписал код. Курсор сразу скрывается при запуске приложения как вы хотите. И продолжает нормально работать после фуллскрина. package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageDisplayState; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { public function Main() { var bitmap:Bitmap = new Bitmap(); bitmap.bitmapData = new BitmapData(800, 600, false, 0); var sprite:Sprite = new Sprite(); addChild(sprite); sprite.addChild(bitmap); var mainMenu:MainMenu = new MainMenu(); addChild(mainMenu); stage.addEventListener(MouseEvent.CLICK, stage_click); } private function stage_click(e:MouseEvent):void { stage.scaleMode = StageScaleMode.EXACT_FIT; stage.displayState = StageDisplayState.FULL_SCREEN; } } } package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.ui.Mouse; import flash.utils.Timer; public class MainMenu extends Bitmap { private var _timerIdle:Timer; public function MainMenu() { bitmapData = new BitmapData(100, 100, false, 0xff0000); visible = false; Mouse.hide(); if (stage) initMonitoringMouseMove(); else addEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); } private function initMonitoringMouseMove(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeaveHandler); stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); _timerIdle = new Timer(2000); _timerIdle.addEventListener(TimerEvent.TIMER, onTimerIdleCompleteHandler); onMouseOverHandler(); } private function onMouseOverHandler(e:MouseEvent = null):void { stage.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); } private function onMouseLeaveHandler(e:Event):void { trace('mouseLeave'); stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); } private function onMouseMoveHandler(e:MouseEvent):void { visible = true; Mouse.show(); _timerIdle.delay = 2000; _timerIdle.start(); } private function onTimerIdleCompleteHandler(e:TimerEvent):void { _timerIdle.stop(); visible = false; Mouse.hide(); } public function destroy():void { removeEventListener(Event.ADDED_TO_STAGE, initMonitoringMouseMove); if (stage) { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler); stage.removeEventListener(Event.MOUSE_LEAVE, onMouseLeaveHandler); } if (_timerIdle) { _timerIdle.stop(); _timerIdle.removeEventListener(TimerEvent.TIMER, onTimerIdleCompleteHandler); } } } } |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
|
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Событие то баблится, но нужно обеспечить чтобы у стейджа был ребенок, размером с проектор.
|
|
|||||
Цитата:
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
callme, попробовал Ваш скрипт ) Точно так же как и у меня в проекте - не работает как надо. Вы видимо не заметили.. Курсор за пределами экрана не должен исчезать и ввлиять на появление менюшки. Когда внутри окна - то при движении мыши менюшка появляется, если простаивает - через 2 сек исчезает вместе с курсором. Все отлично - работает как и задумывалось.
Но теперь попробуйте перейти кликом в FullScreen и потом обратно в оконный режим. После этого MOUSE_LEAVE уже не ловится.. - и поэтмоу курсор за пределами окна начинает себя вести также, как и внутри... Если после этого мышкой изменить размер окна - MOUSE_LEAVE снова начинает работать.
__________________
кто не отвечает, того garbage collector забирает |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Цитата:
Похоже у вас баг плеера. Менять курсор плеер может только в пределах своего окна. Отлавливать MOUSE_MOVE плеер может только в пределах своего окна. Скажите какая у вас версия плеера, проверю на ней. Чтобы узнать версию плеера, надо щелкнуть правой клавишей мыши в окне плеера. Либо trace(Capabilities.version); |
Часовой пояс GMT +4, время: 16:00. |
|
« Предыдущая тема | Следующая тема » |
|
|