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.
mars 17th, 2007 at 8:19
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
mars 17th, 2007 at 11:36
Voila justement un des interets du releaseoutside.
avril 4th, 2007 at 21:19
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
avril 4th, 2007 at 22:08
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.
avril 5th, 2007 at 22:30
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 !