Creare MovieClip modali in TopMost

Lunedì 12 Novembre, 2007

Illustrerò una tecnica per realizzare simboli (MovieClip) modali da usare similmente ai componenti Alert e Window di Flash. L'obiettivo è quello di mostrare un MovieClip sopra tutti gli altri, disabilitando - anche - l'accesso all'area sottostante e qualsiasi altro oggetto/componente presente. Ad essere sincero ho realizzato tutto ciò eseguendo un po' di reverse engineering dai codici Adobe, che sono in chiaro! Non ho proprio resistito ;)

L'artefizio che si usa, per disabilitare qualsiasi interfaccia presente al di sotto del nostro MovieClip, è quella di creare un MovieClip trasparente che prenda tutta l'area dello stage. A questo MovieClip, che non sarà praticamente visibile, si aggancia un metodo "nullo" sull'evento onRelease, stando attenti ad impostare la proprietà useHandCursor a false.

Prima di tutto creiamo un filmato con una qualsiasi interfaccia nello stage principale:

Interfaccia

Questa è composta da un TextField, un TextInput e un bottone usato aprire il nostro MovieClip modale: il nostro popUp personalizzato.

Quando andremo ad aggiungere il nostro simbolo tramite attachMovie() quello che vedremo sarà:

MovieClip modale

Ho lasciato in rosso (alpha=10) il MovieClip fantasma che blocca l'interfaccia sottostante, così da essere visto. Il nostro simbolo può essere fatto in qualsiasi modo, basta impostare nelle proprietà un identificatore (ad esempio moviemodal) e la classe 2.0 a MovieClipModal:

Impostazioni simbolo

Ecco la classe MovieClipModal:

Actionscript:
  1. /*
  2. **
  3. ** file   : MovieClipModal.as
  4. ** Author      : Giovambattista Fazioli (g.fazioli@undolog.com)
  5. ** Web      : http://www.undolog.com
  6. ** Email        : g (dot) fazioli (at) undolog (dot) (com)
  7. ** Created    : 08/11/2007 23.57
  8. ** Modified  : 08/11/2007 23.57
  9. **
  10. **
  11. */
  12. import mx.managers.DepthManager;
  13. //
  14. class MovieClipModal extends MovieClip {
  15.     //
  16.     private var __release:String = "1.0";
  17.     //
  18.     private var __modal_mc:MovieClip;
  19.     //
  20.     private var __movieWidth:Number = 0;
  21.     private var __movieHeight:Number = 0;
  22.     private var __left:Number = 0;
  23.     private var __right:Number = 0;
  24.     private var __top:Number = 0;
  25.     private var __bottom:Number = 0;   
  26.     //
  27.     function MovieClipModal() {
  28.         Stage.scaleMode = "noscale";
  29.         Stage.addListener(this);
  30.         //
  31.         onLoad = _onLoad;
  32.         onUnload = _onUnload;
  33.         //
  34.         __movieWidth = Stage.width;
  35.         __movieHeight = Stage.height;      
  36.     }
  37.     /*
  38.     ** _onLoad() - wrap onLoad MovieClip
  39.     */
  40.     private function _onLoad() {
  41.         //Key.addListener(this);
  42.         //
  43.         __modal_mc = _root.createEmptyMovieClip("__modal_mc", DepthManager.kTopmost);
  44.         __modal_mc.clear();
  45.         __modal_mc.beginFill(0xff0000, 100);
  46.         __modal_mc.moveTo(0, 0);
  47.         __modal_mc.lineTo(100, 0);
  48.         __modal_mc.lineTo(100, 100);
  49.         __modal_mc.lineTo(0, 100);
  50.         __modal_mc.endFill();
  51.         //
  52.         __modal_mc.setDepthBelow(this);
  53.         __modal_mc._alpha = 10;
  54.         //_global.style.modalTransparency;
  55.         __modal_mc.tabEnabled = __modal_mc.useHandCursor = false;
  56.         //
  57.         __modal_mc.onRelease = function() {};
  58.         //
  59.         onResize();
  60.     }
  61.     /*
  62.     ** _onUnload() - wrap onUnload MovieClip
  63.     */
  64.     private function _onUnload() {
  65.         __modal_mc.removeMovieClip();
  66.     }
  67.     /*
  68.     ** onKeyDown - wrap Key
  69.     */
  70.     private function onKeyDown() {
  71.         if (Key.getCode() == Key.TAB) {
  72.             //Selection.setFocus(); 
  73.         }
  74.     }
  75.     /********************************************************************************************
  76.     ** onResize() event
  77.     ********************************************************************************************/
  78.     private function onResize() {
  79.         var sw:Number = Math.round(Stage.width);
  80.         var sh:Number = Math.round(Stage.height);
  81.         var ow:Number = Math.round(this.__movieWidth);
  82.         var oh:Number = Math.round(this.__movieHeight);
  83.         //
  84.         __modal_mc._x = -Math.floor(((sw - ow) / 2));
  85.         __modal_mc._y = -Math.floor(((sh - oh) / 2));
  86.         __modal_mc._width = Stage.width;
  87.         __modal_mc._height = Stage.height;
  88.     }   
  89. }

Questa classe è solo a titolo di esempio e può essere espansa e migliorata. Tuttavia così com'è funziona egregiamente. Di particolare interesse l'uso del DepthManager per il posizionamento a livello di profondità del nostro MovieClip modale, grazie alla costante kTopmost (righe 43 e 52).

Notare anche la presenza (commentata in questa versione) alle righe 41 e 70 di un aggiuntivo gestore per la tastiera. Il nostro popUp, infatti, contiene un bottone che elimina un possibile imprevisto in questo sistema. L'aggiunta del MovieClip fantasma (righe dalle 43 alla 57) e l'artefizio legato all'evento onRelease(), non impediscono alcuni movimenti da tastiera come la pressione del tasto TAB. In alcuni casi, quindi, potrebbe essere necessario intercettare preventivamente attività da tastiera per dirottarle in altri luoghi, come ad esempio ristabilire il fuoco ad un controllo interno al nostro MovieClip modale.

Post correlati

Un commento a: “Creare MovieClip modali in TopMost”

  1. getAvatar 1.0 Domenica 09 Dicembre, 2007 alle 16:50
    upnews.it ha detto:

    undolog » Blog Archive » Creare MovieClip modali in TopMost…

    Illustrerò una tecnica per realizzare simboli (MovieClip) modali da usare similmente ai componenti Alert e Window di Flash. L’obiettivo è quello di mostrare un MovieClip sopra tutti gli altri, disabilitando - anche - l’accesso all’area sottosta…

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>

Usa <pre> per racchiudere codice