ReleaseOutSide en ActionScript 3.0

Jul 30

Una de las cosas que he leido le reclaman a Adobe en infinidad de sitios de discusión, es haber eliminado el evento de ReleaseOutside. Este evento fue muy utilizado en versiones anteriores de ActionScript, al momento de arrastrar objetos, ya que muchas veces el puntero de mouse se salia del área del objeto que se arrastra dejando permanentemente arrastrando el objeto.

A mi entender, ReleaseOutSide ha sido eliminado debido al mejorado comportamiento de los eventos. Algunos eventos ahora tienen tres fases, lo cual permite que un evento se pueda propagar desde el escenario hacia el Objeto, y del Objeto hacia el escenario nuevamente.
Entonces el secreto de esto, es crear y eliminar un escuchador al Stage de manera estratégica. Reproduciendo así el efecto del evento ReleaseOutSide.
A las pruebas me remito.

Actionscript:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.MouseEvent;
  4.  
  5.     public class Main extends Sprite {
  6.        
  7.         private var circulo:Sprite;
  8.        
  9.         public function Main() {           
  10.             // dibujamos un círculo //
  11.             this.circulo = new Sprite();
  12.             this.circulo.name = "circulo";
  13.             this.circulo.graphics.beginFill(0xFFCC00);
  14.             this.circulo.graphics.drawCircle(0, 0, 50);   
  15.             this.circulo.x = this.stage.stageWidth / 2;
  16.             this.circulo.y = this.stage.stageHeight / 2;           
  17.             this.addChild(this.circulo);
  18.            
  19.             // creamos dos escuchadores, uno que se ejecute al presionar y otro al soltar el mouse.
  20.             this.circulo.addEventListener(MouseEvent.MOUSE_DOWN, this.onMouseDownCirculo);
  21.             this.circulo.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUpCirculo);           
  22.         }
  23.        
  24.         public function onMouseDownCirculo(e:MouseEvent):void {
  25.             this.circulo.alpha = 0.2;
  26.             // aqui es donde está la mágia. Aprovechando la propagación creamos dinámicamente
  27.             // un escuchador al escenerario que se ejecute al propagarse hasta el stage
  28.             // un evento de MOUSE_UP realizado en cualquier lugar del swf.
  29.             this.stage.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUpCirculo);   
  30.         }
  31.        
  32.         public function onMouseUpCirculo(e:MouseEvent):void {
  33.             this.circulo.alpha = 1;   
  34.             // Condicional para demostrar lo que está sucediendo
  35.             if (e.target.name == this.circulo.name) {
  36.                 trace("Soltaste sobre el círculo");
  37.             }else {
  38.                 trace("Soltaste fuera del círculo");
  39.             }
  40.            
  41.             // aquí removemos dinámicamente el escuchador agregado al presionar sobre el circulo
  42.             // para evitar que se ejecute, cuando no sea necesario.
  43.             this.stage.removeEventListener(MouseEvent.MOUSE_UP, this.onMouseUpCirculo);
  44.         }      
  45.     }
  46. }

Cabe aclarar que, es posible de detener la fase de propagación del Evento MouseUp. Es decir, hay que tener cuidado que ningún de los elementos de la lista de visualización esté deteniendo la propagación del evento MouseUp. Ya que de ser así no funcionará el evento, pues nunca llegará al Stage.
A mi entender, si alguien escribe un código que necesita detener la propagación, algo mal está haciendo.
Pero bueno, vale la aclaración.

Por ejemplo este evento estaría deteniendo la fase de propagación. Si soltase el mouse sobre el MovieClip mc el evento no se propagaría hacia el escenario, provocando que código anterior no funcione como se espera.

Actionscript:
  1. mc.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUp);      
  2. public function onMouseUp(e:MouseEvent):void{
  3.     // Detenemos la propagación
  4.     e.stopPropagation();
  5. }

¿Te sirvió esta información?
Contribuye para que este sitio siga existiendo.

____________________

Publique su comentario