Full-Browser Flash Layout

Come creare e gestire il liquid layout con Flash

Inserito il 21-06-2007

Capita sempre più spesso di imbattersi in siti realizzati interamente in flash, che sfruttano tutto lo spazio disponibile nel browser e che riadattano la disposizione degli elementi del filmato, quando la finestra dello stesso viene ridimensionata. Il modo di creare e gestire questo tipo di realizzazione è detto "Liquid Layout". Tale tecnica sfrutta l'oggetto nativo di AS "Stage" e le sue proprietà, per gestire le coordinate degli elementi, conoscere la dimensione della parte "sfruttabile" nel browser e associarvi la posizione dei MovieClip che compongono il filmato stesso. A tal proposito metto a disposizione di chi vorrà scaricarlo, un esempio commentato (spero bene) che spiega la gestione liquid-layout e scaricabile da http://www.v2online.it/classes/llf.zip, in cui è presente, oltre al .fla anche una pagina html che fa parte integrante del layout. Riporto sotto il codice di entrambi i file. Una piccola nota prima del codice... l'html non tiene conto dell'update di Microsoft, che blocca i controlli activex, sarà perciò vostra preoccupazione implementarlo come meglio credete, intanto segnalo un mio articolo a riguardo alla pagina http://www.v2online.it/articoli/bloccoIE.html.

Questo è il codice ActionScript:

//------------------------------------------------------------------------------------------//
// Gestione del Liquid-layout, by And80, V2online.it										//
//------------------------------------------------------------------------------------------//
/*
# Quanto segue è un codice di esempio per l'applicazione pratica di un liquid-layout,
# attraverso il quale è possibile posizionare gli elementi sullo Stage, 
# svincolandoli da una posizione statica decisa in partenza, 
# per operare al meglio con il liquid-layout è preferibile utilizzare gli strumenti 
# messi a disposizione da AS per creare, attaccare, caricare dall'esterno i MovieClip,
# i quali sono lo strumento più indicato (forse l'unico se escludiamo i Button e i _level)
# per creare un liquid-layout facilmente gestibile, perciò nel nostro esempio andremo ad
# utilizzare i metodi propri dei MovieClip quali createEmptyMovieClip, attachMovie, loadMovie 
# (quest'ultimo visto che lavoriamo con Flash MX 2004 lo possiamo tranquillamente sostituire 
# con loadClip della classe MovieClipLoader), per l'approfondimento sull'uso di questi metodi
# consiglio di guardare direttamente la guida in linea interna (F1) o di leggere l'articolo 
# all'indirizzo http://www.v2online.it/articoli/moviecliploader.html .
# Per il resto, per quanto mi sia possibile, cercherò di commentare al meglio l'esempio che segue
*/
//------------------------------------------------------------------------------------------//
//
//------------------------------------------------------------------------------------------//
// Opzioni di routine, per portare in alto a sinistra il punto 0,0 del filmato,
// per bloccare il menù tasto destro e per rendere fissa la scala del filmato
//------------------------------------------------------------------------------------------//
Stage.scaleMode = "noScale";
Stage.align = "TL";
Stage.showMenu = false;
//------------------------------------------------------------------------------------------//
//
//------------------------------------------------------------------------------------------//
// Gestione dello sfondo e degli elementi:
//------------------------------------------------------------------------------------------//
// creo un mc vuoto che occupi il primo livello (per noi il più basso) nello Stage
var sfondo:MovieClip = _root.createEmptyMovieClip("sfondo", 1);
// ne creo altri quattro che saranno i miei elementi "a spasso" nello Stage,
// e gli attacco subito i clip che ho creato e concatenato dalla libreria
var altoSinistra:MovieClip = _root.createEmptyMovieClip("altoSinistra", 2);
var altoDestra:MovieClip = _root.createEmptyMovieClip("altoDestra", 3);
var bassoSinistra:MovieClip = _root.createEmptyMovieClip("bassoSinistra", 4);
var bassoDestra:MovieClip = _root.createEmptyMovieClip("bassoDestra", 5);
var inMezzo:MovieClip = _root.createEmptyMovieClip("inMezzo", 6);
altoSinistra.attachMovie("altoSinistra", "dentro", 1);
altoDestra.attachMovie("altoDestra", "dentro", 1);
bassoSinistra.attachMovie("bassoSinistra", "dentro", 1);
bassoDestra.attachMovie("bassoDestra", "dentro", 1);
inMezzo.attachMovie("inMezzo", "dentro", 1);
// per gestire il caricamento dell'immagine che ci farà da sfondo utilizzo la classe MovieClipLoader
// per approfondimenti prego di consultare la guida in linea (F1) o http://www.v2online.it/articoli/moviecliploader.html
var mObj:Object = new Object();
mObj.onLoadInit = function(target) {
	target._alpha = 100;
	target._width = Stage.width;
	target._height = Stage.height;
};
mObj.onLoadStart = function(target) {
	target._alpha = 0;
};
var mLoad:MovieClipLoader = new MovieClipLoader();
mLoad.addListener(mObj);
mLoad.loadClip("Immagini1.jpg", sfondo);
//
// creo una funzione per gestire i MovieClip che non caricano filmati o immagini esterne
// questo in modo da poterla richiamare all'inizio del filmato e ogni volta dentro il listener
// che gestisce l'onResize del filmato, non posso fare tutto solo con la funzione del listener
// perchè i clip che caricano immagini esterne creano problemi finchè la jpeg/swf non è completamente caricata
// perciò ogni movimento relativo ai clip "neutri" (chiamiamoli così :E ) và qui dentro
// diciamo che io ho quattro clip che indicano quattro frecce e ognuno di essi ha il proprio punto di registrazione in alto a sinistra
// e un clip che sta in mezzo allo stage, sempre con il punto di registrazione in alto a sinistra
var controlloNeutro:Function = function () {
	altoSinistra._x = 0;
	altoSinistra._y = 0;
	bassoSinistra._x = 0;
	bassoSinistra._y = Stage.height-bassoSinistra._height;
	altoDestra._x = Stage.width-altoDestra._width;
	altoDestra._y = 0;
	bassoDestra._x = Stage.width-bassoDestra._width;
	bassoDestra._y = Stage.height-bassoDestra._height;
	inMezzo._x = Stage.width/2-inMezzo._width/2;
	inMezzo._y = Stage.height/2-inMezzo._height/2;
};
// ora "attivo" la gestione dell' onResize, il fulcro del layout Liquido, per farlo devo creare un oggetto che
// "ascolti" gli eventi di ridimensionamento (in pratica quando c'è una variazione di dimensione nella finestra ch contiene il filmato)
var liquid:Object = new Object();
liquid.onResize = function() {
	// ok eccoci, qui dentro mettiamo il richiamo alla funzione preparata precedentemente
	// e tutte le azioni riguardanti anche i clip caricati dall'esterno
	controlloNeutro();
	sfondo._width = Stage.width;
	sfondo._height = Stage.height;
};
Stage.addListener(liquid);
// dopodichè richiamo la funzione almeno una volta per risolvere alcune incompatibilità e problemi con browser differenti
controlloNeutro();
//------------------------------------------------------------------------------------------//
//
//------------------------------------------------------------------------------------------//
/*
# Fondamentalmente non occorre altro se non un po' di progettazione prima di iniziare a scrivere 
# il codice per "creare" il filmato e tanta fantasia per i mille modi di sfruttare questo tipo di 
# impostazione, io vi ho dato uno spunto, ora sta a voi. Buon Lavoro ;-) 
*/

Questa invece è la pagina html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>liquid_layout_fmx2004</title>
<style type="text/css">
html, body {
margin: 0px;
padding: 0px;
width: 100%;
height: 100%;
background-color:#FFFFFF;
}
object {
display: block;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<object id='flashpage' type='application/x-shockwave-flash' data='liquid_layout_fmx2004.swf'>
<param name="movie" value="liquid_layout_fmx2004.swf" />
</object>
</body>
</html>

Questo è tutto, ricordo che la versione del file .fla e del codice AS sono rispettivamente la Mx2004 e AS2.