Comunidad de diseño web y desarrollo en internet online

Forzar reescalado de componente Flash al iniciar el navegador...

Citar            
MensajeEscrito el 21 Abr 2011 07:14 pm
Hola,
lo que pretendo hacer es una web cuyo fondo sea un clip que cargue un swf externo, y que éste se adapte al tamaño del navegador. Y que el contenido no se reescale.

Sé que hay muchos post al respecto, y el problema no lo tengo en implementarlo, este es el código:

Código ActionScript :

      public var loader:Loader; 
      public var backgroundHolder:MovieClip;
      public var content:Content; 
      
      public function Main() 
      {
         stage.align = StageAlign.TOP_LEFT;
         stage.scaleMode = StageScaleMode.NO_SCALE;
         //Listeners:
         stage.addEventListener(Event.RESIZE, onResize);
         stage.addEventListener(Event.ADDED_TO_STAGE, onAdded);
         
         loader = new Loader();
         loader.load(new URLRequest("Instance.swf"));
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
         
         backgroundHolder = new MovieClip();
         content = new Content();
      }
      private function display():void {
         addChild(backgroundHolder); 
         content.display();
         addChild(content);
      }
      private function onLoad(event:Event):void {
         loader.removeEventListener(Event.COMPLETE, onLoad);
         backgroundHolder.addChild(loader);
         display();
      }
      private function onResize(event:Event=null):void {
         backgroundHolder.width = stage.stageWidth;
         backgroundHolder.height = stage.stageHeight;
      }
      private function onAdded(event:Event):void
      {
         onResize();
      }

y en el html tengo lo siguiente:

Código ActionScript :

<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
   var flashvars = {};
   flashvars.avoidCache = true;
        var params = {menu:"false", scale:"noscale", bgcolor:"ffffff", allowScriptAccess:"always", allowFullScreen:"true"};
        var attributes = {};
        //swfobject.embedSWF(swfUrl,      id,    width, height, version, expressInstallSwfurl, flashvars, params, attributes)
        swfobject.embedSWF("main.swf", "miFlash", "100%", "100%", "9.0.0", false,  flashvars, params, attributes);
</script>
 
<style type="text/css" media="screen">
   html, body {
      height:100%;
      width:100%;
   }
   body {
      margin:0;
      padding:0;
      overflow:hidden;
   }
</style>
</head>
 ...


Cuando inicio el navegador no me aparece escalado, cuando reescalo el navegador entonces ya obtengo lo que busco, fondo adaptado al navegador y contenido sin escalado. El problema lo tengo al inicio, quiero que la primera vez aparezca escalado. Lo he forzado pero tampoco....

AYUDA POR FAVOR! He hecho mil pruebas, esta casi salvo ese detalle :S
Gracias de antemano

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 Abr 2011 11:33 am
El tema es que al arrancar Flash siempre se inicia comop si tuviera el stage en el tamaño por defecto, aunque no sea así. La solución pasa por hacer que pases por flashvars el ancho/alto de la ventana, lo mas simple es que uses JS para pillar el Screen.width / Screen.height

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 23 Abr 2011 08:12 am
Muchas gracias Jorge.

¿Me puedes indicar como hacerlo?

Por emedmaria

73 de clabLevel



 

safari
Citar            
MensajeEscrito el 23 Abr 2011 11:10 am
Claro:

Código :

swfobject.embedSWF("main.swf", "miFlash", "100%", "100%", "9.0.0", false,  {ancho:screen.width,alto:screen.height}, params, attributes); 


Ahora tienes dos variables, ancho y alto que te indican el tamaño de la pantalla. Pero cuidado, puede que el usuario no maximize el navegador, y quizás entonces usar el ancho y alto del browser sea mas seguro: http://www.javascripter.net/faq/browserw.htm

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 05:35 pm
Muchisimas gracias Jorge!

Siento insistir, pero imagino que a parte de incluir los parámetros en el html debo hacer uso de ellos... Lo he incluido y sigue sin reescalarme el swf al inicio. ¿Qué se me olvida?

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 05:41 pm
Claro, tienes que hacer al inicio lo que tengas en el onResize, pero usando ahora los parametros que te vienen por flashvars

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 05:52 pm
Ando algo pez en como establecer la 'comunicación' del html con el flash

Seria algo así?

Código ActionScript :

var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
function onResize():void{
       backgroundHolder.width = Number(paramObj["ancho"])
       backgroundHolder.height = Number(paramObj["alto"]);
}

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 06:11 pm
No hace falta la notación de paréntesis, ya que las propiedades son expuestas como propiedades del objeto. Cuidado, no uses la misma función que usas para el evento onResize, porque dejará de funcionar cuando reescales la ventana, ya que tomará el valor del flashvars en vez del Stage

Number(paramObj.ancho)
Number(paramObj.alto)

Igual como lo pusiste deber{ia funcionar, siempre que llames a onResize cuando se inicia tu pelicula

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 06:29 pm
He hecho lo siguiente:

Tengo una función

Código ActionScript :

      private function initWindow():void {
         
         var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
         
         winW = int(paramObj.ancho);
         winH = int(paramObj.alto);      
         
         backgroundHolder.width = winW;
         backgroundHolder.height = winH; 
         
         var chivato_txt:TextField = new TextField();
         chivato_txt.text = "WIDTH: "+winW.toString();
         addChild(chivato_txt);
         
         var chivato2_txt:TextField = new TextField();
         chivato2_txt.y = 20;
         chivato2_txt.text = "HEIGHT: "+winH.toString();
         addChild(chivato2_txt);
      }

que la llamo al tras la carga del swf externo

Código ActionScript :

      private function onLoad(event:Event):void {
         loader.removeEventListener(Event.COMPLETE, onLoad);
         backgroundHolder.addChild(loader);
         display();
         initWindow();
      }


Me he declarado dos chivatos para ver si toma bien los valores de ancho y alto y al visualizar el html me muestra 1680x1050 que es correcto peeeeero....El html se ve en blanco (no se ve el swf..) hasta que reescalo, entonces sí se ve. No entiendo por qué sucede ésto :( ¿Qué puede estar pasando si los datos de ancho y alto son correctos?

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 06:34 pm
He hecho una prueba con la carga externa de una imagen estática sí funciona correctamente

Código ActionScript :

loader.load(new URLRequest("images/pic01.png"));


¿Puede tener algo que ver que sea un swf o clip animado? No entiendo porque pasa...

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 06:52 pm
Si no pudiera acceder al MC deberia tirarte un error que no lo encuentra, por lo que asumo que el clip se esta reescalando u otro codigo lo reescala despues de que se haya ejecutado tu initWindow

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 07:22 pm
No, no me aparece ningún error y al reescalar sí aparece...el problema es en el init por lo visto como si no tomara los valores correctos o lo escalara a 0...Seguiré peleandome pero se me agotan las ideas...

Gracias igualmente!!!

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 07:24 pm
Otra opcon es que tu MC no este en el displayList al momento de escalarlo, puedes agregarle un listener al evento ADDED_TO_STAGE y reescalarlo alli con los valores del flashvars

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 07:49 pm
Lo he pensado y he asignado el listener al Mc, y el método de escucha donde hago el initWindow

Código ActionScript :

backgroundHolder.addEventListener(Event.ADDED_TO_STAGE, onAdded);
private function onAdded(event:Event):void
{
   initWindow();
}


me he vuelto a poner TextDFields como chivatos tras el InitWindow y winH/winW toma los valores correctamente pero el ancho y alto del Mc es 0 :S. Debe estar ahí el problema pero no lo entiendo porque en el initWin le asigno esos valores...Toodo un misterio..
Al reescalar todo bien

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 07:55 pm
¿Y dentro de ese MC no hay nada que lo reescale?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 08:01 pm
Es un Mc vacio que carga un swf externo y posteriormente es añadido al stage...Tal y como muestro en display() tras el Load

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 08:23 pm
Entonces tienes que esperar a que termine de cargar el contenido y que se dispare el ADDED_TO_STAGE del Loader

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 08:32 pm
si lo hago así:
loader.addEventListener(Event.ADDED_TO_STAGE, onAdded);
sigue sucediendo lo mismo :(

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 08:42 pm
Quizas falle el cast, es dificil de saber en un trace porque automaticamente saca un toString(), pero si intentas alguna operación y uno de los sumandos no es Number te sale NaN o undefined, algo asi

var control:Number = Number(paramObj.ancho) + 100;

trace("Ancho "+control)

O muestralo en tu chivato si ya lo tienes

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 08:56 pm
Efectivamente el output es :"Ancho NaN"

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Abr 2011 09:03 pm
Ok, estas recibiendo basura en el input, asegurate por ejemplo de no tener espacios en blanco al principio o final del string, etc

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Abr 2011 09:13 pm
Si, hago el cast a int

winW = int(paramObj.ancho);
winH = int(paramObj.alto);

y hago el trace:
var control:int = winW + 100;
trace("Ancho " + control);
output:100
por tanto winW en el flash es cero pero en el html el trace me indica 1780 por tanto winW es 1680 pero sigue sin mostrarse :S

Por emedmaria

73 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.