Con Flash CS3 e Actionscript 3.0 sono state riviste molte cose tra cui la presenza dell’evento onReleaseOutside. Quest’ultimo, come altre tante cosine, è stato eliminato senza una vera e propria ragione e senza una vera e propria alternativa. Nella documentazione ufficiale di Actiobscript 3.0, nella sezione Migrazione da ActionScript 2.0, cercando per onReleaseOutside viene indicato:
Sostituito nel nuovo modello di eventi da un evento
mouseUp.
Quest’affermazione, purtroppo, non è del tutto vera! Anzi, non lo è per niente. Il "vecchio" evento onReleaseOutside aveva la caratteristica di scattare (trigged) anche quando il mouse era fuori dall’oggetto in questione. Questa situazione, poi, è molto più frequente di quanto non si pensi. Una soluzione "pulita" e ufficiale di fatto non esiste, o almeno io non l’ho trovata. Quello che può essere fatto è, come al solito, usare un trucco, un triks come dicono gli anglossassoni! In pratica si aggancia un evento MOUSE_UP nello Stage, così da intercettare il rilascio del tasto del mouse.
Vediamo un esempio comune (solo i listeners) dove si sente la mancanza di onReleaseOutside: abbiamo un Knob (manopola) spostata tramite startDrag() lungo un percorso prestabilito.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* ** knob Listeners */ protected function knobMouseDown( e:MouseEvent ):void { __knob.startDrag(false, __rect); } protected function knobMouseOut( e:MouseEvent ):void { if ( e.buttonDown ) e.target.stage.addEventListener( MouseEvent.MOUSE_UP, knobMouseUpb ); } protected function knobMouseUp( e:MouseEvent ):void { __knob.stopDrag(); } protected function knobMouseUpb( e:MouseEvent ):void { e.target.stage.removeEventListener( MouseEvent.MOUSE_UP, knobMouseUpb ); __knob.stopDrag(); } |
Il trucco viene svolto dall’evento knobMouseOut (riga ??). Quando scatta quest’evento, cioè quando il mouse esce dall’oggetto "draggato", viene aggiunto un evento MOUSE_UP sullo Stage. Di eventi MOUSE_UP, nel mio esempio, ne sono presenti due: uno "normale" e uno per lo Stage (knobMouseUpb). knobMouseUpb è identico a knobMouseUp, la sola differenza è l’eliminazione del listener sullo Stage, giusto per liberare memoria inutile
Anche Adobe, di fatto, consiglia la stessa tecnica:
http://www.adobe.com/devnet/actionscript/articles/event_handling_as3_05.html








4
Non ci sono commenti per questo Post
Lascia un commento