Actionscript 3.0: simulare l’evento onReleaseOutside

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

Non ci sono commenti per questo Post

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
					<code></code> // blocco generico
					[cc_actionscript][/cc_actionscript] // Actionscript
					[cc_actionscript3][/cc_actionscript3] // Actionscript 3
					[cc_css][/cc_css] // CSS Style Sheet
					[cc_html][/cc_html] // HTML
					[cc_js][/cc_js] // Javascript
					[cc_objc][/cc_objc] // Objective-C
					[cc_php][/cc_objc] // PHP
					[cc_sql][/cc_sql] // SQL


Stop SOPA