Я столкнулся с аналогичной проблемой в программе просмотра PDF-файлов, которую мне пришлось встроить в приложение Flex. Я хотел, чтобы функции панорамирования продолжали работать, даже если мышь покидает рабочую область или окно браузера. Вот как я это сделал: я изменил код, чтобы удалить ссылки на классы Flex Framework, поэтому это должно быть применимо к любому проекту AS3. На mouseDown
я бы начал отслеживать эти значения по таймеру. _client
может быть любым flash.display.DisplayObject
на целевой стадии. В моем случае это был объект Flex mx.controls.SWFLoader
, но в вашем случае я предполагаю, что это будет цель перетаскивания:
private function get currentMouseX():Number
{
return _client.stage.mouseX;
}
private function get currentMouseY():Number
{
return _client.stage.mouseY;
}
Значения stage.mouseX
и stage.mouseY
определяются относительно сцены, находится ли мышь в рабочей области или даже в окне браузера (по крайней мере, в Flash Player 10, я не тестировал это в более ранних версиях флэш-плеера). Чтобы увидеть, находится ли мышь за пределами сцены, просто проверьте, находятся ли эти значения внутри сцены, например:
if (currentMouseY < 0 ||
currentMouseY > _client.stage.height ||
currentMouseX < 0 ||
currentMouseX > _client.stage.width)
{
// Do something here
}
РЕДАКТИРОВАТЬ: Что касается обнаружения события mouseUp
вне сцены, если вы зарегистрируете слушателя на сцене, будет выдано mouseUp, даже если событие происходит вне сцены или браузера. Вот код того, как я обрабатываю функцию событий для справки. Объект _client
может быть любым flash.display.DisplayObject
:
// attach the events like so when you initialize
_client.addEventListener(MouseEvent.MOUSE_DOWN , handleMouse);
_client.addEventListener(MouseEvent.MOUSE_OUT , handleMouse);
_client.addEventListener(MouseEvent.MOUSE_OVER , handleMouse);
//
// and handle them like this:
private function handleMouse(e:MouseEvent):void
{
switch(e.type)
{
case "mouseDown":
// add listeners, notice the mouse move and mouse up are
// attached to the stage, not the display object this way
// events are issued regardless of whether the mouse is in
// the stage or even within the browser window
_client.stage.addEventListener(MouseEvent.MOUSE_UP, handleMouse);
_client.addEventListener(MouseEvent.CLICK, handleMouse);
_client.stage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouse);
// remove listeners
_client.removeEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
//
// commands / actions
break;
case "mouseUp":
// add listeners
_client.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
// remove listeners
_client.stage.removeEventListener(MouseEvent.MOUSE_UP, handleMouse);
_client.stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouse);
// commands/actions
break;
case "click":
// add listeners
_client.addEventListener(MouseEvent.DOUBLE_CLICK, handleMouse);
// remove listeners
_client.removeEventListener(MouseEvent.CLICK, handleMouse);
// commands / actions
break;
case "mouseMove":
// add listeners
// remove listeners
_client.stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouse);
_client.removeEventListener(MouseEvent.CLICK, handleMouse);
// commands
break;
case "mouseOut":
// add listeners
// remove listeners
// commands / actions
break;
case "mouseOver":
// add listeners
// remove listeners
// commands /actions
break;
}
}
РЕДАКТИРОВАТЬ: удалены ссылки на классы фреймворка Flex. РЕДАКТИРОВАТЬ: Я помню, что при запуске приложения в браузере Safari в Mac OSX могут возникнуть проблемы с событиями за пределами окна браузера. Обязательно протестируйте этот код в этом браузере, если вы его используете. В моем приложении это не было проблемой, поэтому я больше не разбирался в проблеме.
person
Ryan Lynch
schedule
07.11.2009