Самая простая реализация onReleaseOutside в AS3? - PullRequest
4 голосов
/ 01 ноября 2008

Я давний пользователь ActionScript 2, теперь начинаю работать с ActionScript 3. Единственное, чего мне не хватает, - это простого способа дублировать функциональность MovieClip.onReleaseOutside в AS2. Почти всегда необходимо реализовать это событие, в противном случае вы получите забавные ошибки, такие как flash думает, что ваша мышь не работает, когда она действительно работает.

Согласно руководству по миграции AS2 в AS3 , я должен использовать для этого flash.display.InteractiveObject.setCapture(), но, насколько я могу судить, его не существует. Я думаю, что этот документ устарел или неверен. Я нашел несколько постов в сети о том, как дублировать эту функцию, но у них есть свои проблемы:

  • Этот срабатывает onReleaseOutside, даже если не было соответствующего события onPress.
  • Этот кажется очень неэффективным, вы будете добавлять и удалять прослушиватель событий каждый раз, когда щелкаете мышью в любом месте вашего приложения.

Должен быть более простой способ, не говорите мне, что Adobe забыла об этом при переписывании Actionscript?

Пример кода AS2:

// Assume myMC is a simple square or something on the stage

myMC.onPress = function() {
  this._rotation = 45;
}

myMC.onRelease = myMC.onReleaseOutside = function() {
  this._rotation = 0;
}

Без обработчика onReleaseOutside, если вы нажмете на квадрат, перетащите мышку за его пределы и отпустите кнопку мыши, квадрат не будет вращаться и будет зависать.

Ответы [ 3 ]

10 голосов
/ 03 ноября 2008

Простой и надежный:

button.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
button.addEventListener( MouseEvent.MOUSE_UP, buttonMouseUpHandler ); // *

function mouseDownHandler( event : MouseEvent ) : void {
    trace( "onPress" );
    // this will catch the event anywhere
    event.target.stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}

function buttonMouseUpHandler( event : MouseEvent ) : void {
    trace( "onRelease" );
    // don't bubble up, which would trigger the mouse up on the stage
    event.stopImmediatePropagation( );
}

function mouseUpHandler( event : MouseEvent ) : void {
    trace( "onReleaseOutside" );
    event.target.removeEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}

Если вас не волнует разница между onRelease и onReleaseOutside (например, с перетаскиваемыми элементами), вы пропускаете прослушиватель мыши на самой кнопке (здесь отмечается звездочкой).

3 голосов
/ 01 ноября 2008

root.addEventListener (MouseEvent.UP, onMouseReleaseOutside);

Вы, конечно, определяете onMouseReleaseOutside. По сути, любой MouseEvent.UP (релиз мыши), который происходит за пределами вашей кнопки (или mc), попадет на сцену вместо вашей кнопки. Так я обычно ловлю это.

3 голосов
/ 01 ноября 2008

Вы смотрели на это событие:

flash.events.Event.MOUSE_LEAVE



Из документации:

Отправляется объектом рабочей области, когда указатель мыши выходит за пределы рабочей области. Константа Event.MOUSE_LEAVE определяет значение свойства type объекта события mouseLeave.

Это решит вашу проблему, если вас заинтересует, будет ли мышь пользователя вне сцены, а не снаружи этого конкретного мувиклипа.

...