ReleaseOutside en ActionScript 3

Vous avez surement pu voir un certain nombre de changements dans la gestion des évenements en as3. Que ce soit pour les MouseEvent, les KeyEvent comme pour tous les autres, quelques petits points sont assez surprenants.

Attardons nous un peu plus sur les MouseEvent. Nous avons désormais une bien belle liste : CLICK, DOUBLE_CLICK, MOUSE_DOWN, MOUSE_MOVE, MOUSE_OUT, MOUSE_OVER, MOUSE_UP, MOUSE_WHEEL, ROLL_OUT et ROLL_OVER. Manque tout de même le fameux ReleaseOutside qui ne figure nulle part. Impossible donc de faire un banal ReleaseOutside en as3 me direz vous ? Quelle dommage quand même…

Je me suis donc empressé de créer une petite classe qui corrige ce petit désagrément. Un petit ReleaseOutside “décorateur” (l’objet d’un nouveau billet) qui décore donc l’objet à écouter. Tout simplement.

Exemple :

import com.emmanuelbonnet.utils.ReleaseOutside;
 
_onPress = function(ev:Event):void {
	trace("_onPress");
}
 
_onReleaseOutside = function(ev:Event):void {
	trace("_onReleaseOutside");
}
 
var eRelease:ReleaseOutside = new ReleaseOutside(mcBtn);
eRelease.addEventListener("releaseOutside", _onReleaseOutside);
eRelease.addEventListener("mouseDown", _onPress);
eRelease.x = 10;

Download this code: TestReleaseOutside.as

Et voici la petite classe :

package com.emmanuelbonnet.utils {

	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.utils.Proxy;
	import flash.utils.flash_proxy;

	public class ReleaseOutside extends Proxy {

		private var _scope:Object;

		function ReleaseOutside(pScope:Object) {
			_scope = pScope;
			_init();
		}

		private function _init():void {
			_scope.addEventListener(MouseEvent.MOUSE_DOWN, _onPressFOS);
		}

		private function _onPressFOS(ev:MouseEvent):void {
			_scope.addEventListener(MouseEvent.ROLL_OUT, _onRollOutFOS);
		}

		private function _onRollOutFOS(ev:MouseEvent):void {
			if(ev.buttonDown) _scope.stage.addEventListener(MouseEvent.MOUSE_UP, _onReleaseOutsideFOS);
			_scope.removeEventListener(MouseEvent.ROLL_OUT, _onRollOutFOS);
		}

		private function _onReleaseOutsideFOS(ev:MouseEvent):void {
			var e:Event = new Event("releaseOutside");
			_scope.dispatchEvent(e);
			_scope.stage.removeEventListener(MouseEvent.MOUSE_UP, _onReleaseOutsideFOS);
		}

		override flash_proxy function callProperty(methodName:*, ... args):* {
			return _scope[methodName].apply(_scope, args);
	    }

	    override flash_proxy function getProperty(name:*):* {
	        return _scope[name];
	    }

	    override flash_proxy function setProperty(name:*, value:*):void {
	        _scope[name] = value;
	    }

	}
}

Download this code: ReleaseOutside.as

Un grand merci à Pierrot pour m’avoir fait découvrir la magnifique classe Proxy.

6 Responses to “ReleaseOutside en ActionScript 3”

  1. Antonin Says:

    J’ai jamais eu à développé une application ou un site sur lequel le release outside avait une utilité. Beaucoup de développeurs oublient d’ailleurs de le coupler au rollout, ce qui fait que les boutons restent dans leur etat over quand on releaseoutside

  2. manu Says:

    Voila justement un des interets du releaseoutside.

  3. tiv Says:

    Cette classe contient des éléments très interessants. Cependant, elle me semble un peu compliqué pour un “ReleaseOutside”. J’ai eu le prblm aussi, mais j’ai résolu le problème en ajoutant l’évènement sur le stage.
    à lire sur : http://blog.homeserv.org/#id11

  4. manu Says:

    Ta méthode est intéressante mais il faudrait activer l’écouteur sur stage une fois le MouseEvent.MOUSE_DOWN sinon, le onReleaseOutside est exécuté a chaque MOUSE_UP sans forcement de MOUSE_DOWN sur l’objet avant.

  5. tiv Says:

    Très judicieuse remarque. Effectivement, j’avais repéré ce problème. Il faudrait donc activer le MOUSE_UP, quand l’event MOUSE_DOWN est dispatché, le détruire dans le MOUSE_UP, et le recréer dans MOUSE_DOWN, etc…. ok, Merci !

  6. imagina Says:

    Il faut déclarer le Mouse_UP dans le stage et le proble et réglé définitivement

    bmod.addEventListener(MouseEvent.MOUSE_DOWN, mdown);
    bmod.addEventListener(MouseEvent.MOUSE_UP, rel);

    /*fait votre bouton
    var sourieH:extractH=new extractH();
    */

    function extH(event:MouseEvent):void
    {
    sourieH.x = event.stageX;
    sourieH.y = event.stageY;
    }

    function mdown(ev:MouseEvent)
    {

    Mouse.hide();
    //Déclaration de Mouse_up dans le stage
    stage.addEventListener(MouseEvent.MOUSE_UP, rel);

    }

    function rel(ev:MouseEvent)
    {

    Mouse.show();
    }

Leave a Reply

Security Code: