Некоторые хорошие предложения выше из других плакатов.
Определение основ того, что Вы хотите, является очевидным запуском. Но по моему опыту что может также причинить боль, процесс в нисходящем направлении состоит в том, когда исключения не рассматривают. О них почти всегда забывают, пока программное обеспечение не было разработано или поздно в тестировании. Так прикладывает некоторые усилия к размышлению о том, как Вы хотите, чтобы программное обеспечение или процесс работали, когда дела не идут право. Примеры:
Программистам нравится помогать, но не так очень... они очень работали бы над следующей функцией, чем сделали бы производственную поддержку. Но если спецификации обработки исключений плохи, это точно, что все на проекте закончат тем, что делали.
Это может определенно помочь распространить Ваш процесс требований по циклу разработки через итерационную разработку. Вы не всегда знаете, какие виды исключений необходимо будет обработать. Некоторые не управляются бизнесом, но техническими вопросами, такими как поведение пользовательского интерфейса, интеграция с другими системами, И т.д. Даже с этим, хотя, чем лучшие требования к уровню качества можно обеспечить раньше, тем лучше полный процесс будет.
Чтобы получить все это, требуется немного взлома. Вы должны запомнить, находится ли мышь вне сцены или нет, и обработать событие Event.MOUSE_LEAVE
соответственно. Таким образом вы получаете все обычные функциональные возможности мыши, включая отсутствие остановки перетаскивания только потому, что мышь вышла за пределы сцены. Поскольку пользователь может вернуться на сцену и продолжить перетаскивание, он ждет, пока пользователь не отпустит мышь на сцене или вне ее.
var mouseOffStage:Boolean;
var bonk:YourDisplayObject = new YourDisplayObject()
addChild(bonk);
bonk.addEventListener(MouseEvent.MOUSE_DOWN, function():void {
mouseOffStage = false;
bonk.startDrag();
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
stage.addEventListener(Event.MOUSE_LEAVE, mouseLeave);
stage.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);
stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
})
private function mouseUp(e:MouseEvent) :void {
trace("Mouse Up On Stage")
bonk.stopDrag()
}
private function mouseLeave(e:Event) :void {
if(mouseOffStage){
trace("mouse up and off stage");
bonk.stopDrag();
}else{
trace("mouse has left the stage");
//no reason to stop drag here as the user hasn't released the mouse yet
}
}
private function mouseOut(e:MouseEvent) :void {
mouseOffStage = true;
trace("mouse has left the stage")
}
private function mouseOver(e:MouseEvent) :void {
mouseOffStage = false;
trace("mouse has come back on stage");
}
Хакерство заключается в том, что событие MOUSE_LEAVE
, а не MOUSE_UP Событие
запускается, когда мышь отпускается за пределы сцены, поэтому вам нужно отслеживать, была ли мышь уже за пределами сцены, когда она была выпущена.
Если вы делаете что-то там, где вы перетаскиваете MovieClip, это работает нормально.
stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
РЕДАКТИРОВАТЬ - неважно
Есть ли способ определить, покидает ли мышь флэш-ролик, когда мышь удерживается нажатой?
Я не знаю о
Или он выходит за пределы флэш-ролика?
Event.MOUSE_LEAVE действительно происходит, когда вы отпускаете снаружи.
подробнее здесь http://blog.zupko.info/?p=3 см. комментарий JIMISAACS.
Я столкнулся с аналогичной проблемой в программе просмотра 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;
}
The stage.mouseX
и сцена. Значения mouseY
определяются относительно сцены, находится ли мышь в рабочей области или даже в окне браузера (по крайней мере, в Flash Player 10, я не тестировал это в более ранних версиях Flash Player). Чтобы увидеть, находится ли мышь за пределами сцены, просто проверьте, находятся ли эти значения внутри сцены, например:
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;
}
}
EDIT: удалены ссылки на классы инфраструктуры Flex. t проверял это в более ранних версиях flash player). Чтобы увидеть, находится ли мышь за пределами сцены, просто проверьте, находятся ли эти значения внутри сцены, например:
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;
}
}
EDIT: удалены ссылки на классы инфраструктуры Flex. t проверял это в более ранних версиях flash player). Чтобы увидеть, находится ли мышь за пределами сцены, просто проверьте, находятся ли эти значения внутри сцены, например:
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;
}
}
EDIT: удалены ссылки на классы инфраструктуры Flex. 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;
}
}
EDIT: удалены ссылки на классы инфраструктуры Flex. 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;
}
}
EDIT: удалены ссылки на классы инфраструктуры Flex. РЕДАКТИРОВАТЬ: Я помню, что при запуске приложения в браузере Safari на Mac OSX могут возникнуть проблемы с событиями вне окна браузера. Обязательно протестируйте этот код в этом браузере, если вы его используете. Это не было проблемой в моем приложении, поэтому я больше не разбирался в проблеме.
вот что я делаю:
mc.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
private function onMouseDown(_e:MouseEvent):void
{
mc2.startDrag(params);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave);
stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
}
private function onMouseUp(_e:MouseEvent):void
{
ms2.stopDrag();
}
private function onMouseLeave(_e:Event):void
{
mc2.stopDrag();
}
private function onMouseOut(_e:MouseEvent):void
{
if (e.stageX <= 0 || e.stageX >= stage.stageWidth || e.stageY <= 0 || e.stageY >= stage.stageHeight)
{
mc2.stopDrag();
}
}