Обнаружьте этап отпуска Мыши в то время как притягивающий Actionscript 3

Некоторые хорошие предложения выше из других плакатов.

Определение основ того, что Вы хотите, является очевидным запуском. Но по моему опыту что может также причинить боль, процесс в нисходящем направлении состоит в том, когда исключения не рассматривают. О них почти всегда забывают, пока программное обеспечение не было разработано или поздно в тестировании. Так прикладывает некоторые усилия к размышлению о том, как Вы хотите, чтобы программное обеспечение или процесс работали, когда дела не идут право. Примеры:

  • , Куда основополагающие части данных прибывают из? Когда данные не то, где они, как ожидают, будут, что Вы хотите сделать?
  • , Сколько Вы хотите, чтобы программное обеспечение сделало относительно проверки? Если пользователь вводит неправильные данные, у Вас есть ручной процесс для них для фиксации их через, или Вы ожидаете, что программное обеспечение будет достаточно умно упростить исправление? Уровень ума, который Вы хотите, чтобы программное обеспечение имело при обращении к исключениям, может значительно изменить сложность.
  • , В каком количестве прозрачности данных Вы нуждаетесь? Вам, возможно, только понадобятся несколько элементов, но если существует исключение, обеспечивание дополнительных данных может означать различие между пользовательской способностью к самоусовершенствованию проблема, по сравнению с ними имеющий необходимость связаться со справочной службой, другими пользователями и программистом, который является значительно более дорогим.

Программистам нравится помогать, но не так очень... они очень работали бы над следующей функцией, чем сделали бы производственную поддержку. Но если спецификации обработки исключений плохи, это точно, что все на проекте закончат тем, что делали.

Это может определенно помочь распространить Ваш процесс требований по циклу разработки через итерационную разработку. Вы не всегда знаете, какие виды исключений необходимо будет обработать. Некоторые не управляются бизнесом, но техническими вопросами, такими как поведение пользовательского интерфейса, интеграция с другими системами, И т.д. Даже с этим, хотя, чем лучшие требования к уровню качества можно обеспечить раньше, тем лучше полный процесс будет.

16
задан Nik Reiman 9 November 2009 в 08:43
поделиться

5 ответов

Чтобы получить все это, требуется немного взлома. Вы должны запомнить, находится ли мышь вне сцены или нет, и обработать событие 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 Событие запускается, когда мышь отпускается за пределы сцены, поэтому вам нужно отслеживать, была ли мышь уже за пределами сцены, когда она была выпущена.

28
ответ дан 30 November 2019 в 16:58
поделиться

Если вы делаете что-то там, где вы перетаскиваете MovieClip, это работает нормально.

stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);

РЕДАКТИРОВАТЬ - неважно

0
ответ дан 30 November 2019 в 16:58
поделиться

Есть ли способ определить, покидает ли мышь флэш-ролик, когда мышь удерживается нажатой?

Я не знаю о

Или он выходит за пределы флэш-ролика?

Event.MOUSE_LEAVE действительно происходит, когда вы отпускаете снаружи.

подробнее здесь http://blog.zupko.info/?p=3 см. комментарий JIMISAACS.

0
ответ дан 30 November 2019 в 16:58
поделиться

Я столкнулся с аналогичной проблемой в программе просмотра 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 могут возникнуть проблемы с событиями вне окна браузера. Обязательно протестируйте этот код в этом браузере, если вы его используете. Это не было проблемой в моем приложении, поэтому я больше не разбирался в проблеме.

1
ответ дан 30 November 2019 в 16:58
поделиться

вот что я делаю:

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();
    }
}
4
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: