flash - La implementación más sencilla de onReleaseOutside en AS3?
actionscript-3 migration (3)
Soy un usuario de ActionScript 2 desde hace mucho tiempo, ahora estoy comenzando con ActionScript 3. Lo único que me falta es una manera fácil de duplicar la funcionalidad de MovieClip.onReleaseOutside de AS2. Casi siempre es necesario implementar este evento; de lo contrario, obtienes errores graciosos, como flash, cuando piensas que el mouse está inactivo cuando realmente está activo.
De acuerdo con la Guía de migración AS2 a AS3 , se supone que debo usar flash.display.InteractiveObject.setCapture()
para esto, sin embargo, no existe por lo que yo sé. Supongo que este documento está desactualizado o es incorrecto. He encontrado algunas publicaciones en la web sobre cómo duplicar esta funcionalidad, pero también tienen sus propios problemas:
- Este desencadena onReleaseOutside incluso si no hubo un evento onPress correspondiente.
- Este parece muy ineficiente, agregará y eliminará un detector de eventos cada vez que se haga clic en el mouse en cualquier lugar dentro de su aplicación.
Tiene que haber una manera más fácil, ¿no me digas que Adobe se olvidó de esto cuando reescribió Actionscript?
Ejemplo de código 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;
}
Sin el controlador onReleaseOutside, si presionó hacia abajo el squre, arrastró el mouse fuera de él y soltó el mouse, entonces el cuadrado no se soltó y parece estar atascado.
¿Has visto este evento?
flash.events.Event.MOUSE_LEAVE
De la documentación:
Se distribuye por el objeto Stage cuando el puntero del mouse se mueve fuera del área del escenario. La constante Event.MOUSE_LEAVE define el valor de la propiedad type de un objeto de evento mouseLeave.
Resolverá su problema si solo está interesado si el mouse del usuario está fuera del escenario en lugar de fuera de ese MovieClip en particular.
root.addEventListener (MouseEvent.UP, onMouseReleaseOutside);
Usted define onMouseReleaseOutside por supuesto. Básicamente, cualquier MouseEvent.UP (un lanzamiento de mouse) que ocurra fuera de su botón (o mc) tocará el escenario en lugar de su botón. Esta es la forma en que normalmente la atrapo.
Simple e infalible:
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 );
}
Si no le importa la diferencia entre onRelease y onReleaseOutside (por ejemplo, con elementos que se pueden arrastrar), omita el escucha del mouse en el botón mismo (comentado aquí con un asterisco).