Simulando el scroll del navegador con flash

Ejemplo

Para el efecto de deslizamento de esta pelí­cula, he utilizado la clase 'mc_tween2.as' de Fernando Zeh, puedes descargarla en: MC Tween

Para dar un efecto de desplazamiento suave a los contenidos del sitio, utilizamos la clase mc_tween2.as, puedes utilizar cualquier otra clase como por ejemplo las de Laco o simplemente trabajar con las propiedades del objeto (en este caso _y) directamente, mas abajo, veremos como. Lo primero que escribimos en nuestro fla es el #include a la clase.

Actionscript:
  1. #include "mc_tween2.as"

Como habras podido observar en el ejemplo, tanto la barra de scroll como los contenidos de la pelí­cula adaptan su posición y tamaño a los del navegador del navegador. Para manejar los eventos producidos por el cambio de tamaño del escenario en nuestra pelí­cula, utilizamos el método Stage.onResize

Actionscript:
  1. Stage.align = "TL";
  2. Stage.scaleMode = "noScale";

Es recomendable declarar las variables que se van a utilizardurante el proceso al principio del código (por claridad).

Actionscript:
  1. var izq;
  2. var sup;
  3. var der;
  4. var inf;
  5. var porcentaje;
  6. var y;

Las variables que declaro a continuación, permiten que pueda hacer referencia a un objeto desde cualquier parte del código omitiendo la ruta y tambien me ahorra escribir algunas palabras extra.

Actionscript:
  1. var scrollBar_mc = scrollBar_mc;
  2. var drag_mc = scrollBar_mc.drag_mc;
  3. var bar_mc = scrollBar_mc.bar_mc;

El cálculo que se aplica en la función drag() es muy sencillo:

1. Se calcula el porcentaje de la posición del botón de arrastre en base a la altura del escenario.
2. Se aplica el porcentaje calculado anteriormente a la pelí­cula que contiene lo datos.

Por ejemplo. Cuando el botón de arrastre está en _y = 0 el porcentaje es = 0, por tanto, la pelicula contenedora (la que drageamos) tambien lo estará¡. Siempre hay que tener en cuenta, que cuando se hace scroll hacia arriba, hay que añadir la altura del botón de arrastre 'drag_mc' a los cálculos del porcentaje, si n lo hicieramos así­, el scroll no llegarí­a hasta el final.

Actionscript:
  1. function drag () {
  2.     if (drag_mc._y> Stage.height / 2) {
  3.         porcentaje = Math.round (((drag_mc._y + drag_mc._height) / Stage.height) * 100);
  4.     } else {
  5.         porcentaje = Math.round ((drag_mc._y / Stage.height) * 100);
  6.     }
  7.     y = Math.round ((porcentaje / 100) * (holder_mc._height - Stage.height));
  8.     holder_mc.ySlideTo (-y, 2, "easeOutQuart");
  9.     updateAfterEvent ();
  10. }

Cada vez que cambia el tamaño del navegador, hay que recalcular tamaños y posiciones, de manera que los objetos se ajusten, la barra de scroll siempre a la derecha, los contenidos centrados, etc.

Una de las comprobaciones que realiza esta función, es la de observar si es necesario activar el scroll; si la pelí­cula tiene una atura inferior a la altura del navegador, la repuesta es no, pero cabe la posibilidad de que el usuario modifique el tamaño de la ventana del navegador, la función se encargará de activar el scroll.

Actionscript:
  1. function stageResize () {
  2.     bar_mc._x = drag_mc._x = Stage.width - bar_mc._width;
  3.     bar_mc._height = Stage.height;
  4.     drag_mc._height = (Stage.height / 100) * 25;
  5.     izq = Stage.width - drag_mc._width;
  6.     sup = 0;
  7.     der = Stage.width - drag_mc._width;
  8.     inf = Stage.height - (drag_mc._height);
  9.     holder_mc._x = (Stage.width - holder_mc._width) / 2;
  10.     // --  Se comprueba si es necesario activar scroll
  11.     if (holder_mc._height <Stage.height) {
  12.         scrollBar_mc._visible = false;
  13.     } else {
  14.         scrollBar_mc._visible = true;
  15.     }
  16. }

Necesitamos un listener que envie notificación de los cambios sufridos por el navegador a la función 'stageResize()'.

Actionscript:
  1. myListener = new Object ();
  2. myListener.onResize = stageResize;
  3. Stage.addListener (myListener);

Cuando se empieza a ejecutar la pelí­cula, se llama a la función stageResize ya que se desconoce el estado del navegador en ese momento, es posible que flash necesite adapatar la pelí­cula a las condiciones del navegador que pueden estar impuestas por la resolución de pantalla o el tamaño del navegador.

Actionscript:
  1. stageResize ();

Eventos de botón aplicados al botón de arrastre. Se ha utizadola función setInterval() para llamar a la función stageResize(), de esta manera se consigue un flujo de informacion continuo. Cuando se deja el arrastre, se desactiva setInterval().

Actionscript:
  1. drag_mc.onRollOver = function () {
  2.     this.colorTransformTo (-100, 256, -100, 256, -100, 256, 100, 0, 0.2, "linear");
  3. };
  4. drag_mc.onRollOut = function () {
  5.     this.colorTransformTo (100, 0, 100, 0, 100, 0, 100, 0, 0.2, "linear");
  6. };
  7. // --
  8. drag_mc.onPress = function () {
  9.     idInterval = setInterval (drag, 1);
  10.     this.startDrag (false, izq, sup, der, inf);
  11. };
  12. drag_mc.onRelease = drag_mc.onReleaseOutside = function () {
  13.     clearInterval (idInterval);
  14.     stopDrag ();
  15. };

Por último, se ha añadido funcionalidad al scroll de la rueda del Mouse. Se controla que la barra de arrastre no supere los lí­mites superior e inferior de la pelí­cula. Para determinar el sentido del deslizamiento de la rueda, me he servido del parámetro delta, este devuelve un valor negativo cuando se sube (hacer rodar la ruweda hacia abajo) y positivo cuando se baja(hacer rodar la rueda hacia arriba).

Actionscript:
  1. mouseListener = new Object ();
  2. mouseListener.onMouseWheel = function (delta) {
  3.     if (!scrollBar_mc._visible) {
  4.         return;
  5.     }
  6.     if (drag_mc._y <= sup && delta> 0 || drag_mc._y>= inf && delta <0) {
  7.         return;
  8.     } else {
  9.         drag_mc._y -= delta * 10;
  10.         drag ();
  11.     }
  12. };
  13. Mouse.addListener (mouseListener);

Nota

Si por algún motivo, no deseas utilizar la clase mc_tween, puedes substitutir la lí­nea

Actionscript:
  1. holder_mc.ySlideTo (-y, 2, "easeOutQuart");

Por

Actionscript:
  1. holder_mc._y = -y

Descarga Browserscroll Files.zip

Browserscroll Files.zip se ha descargado 1,374 veces.

3 Votes | Average: 5 out of 53 Votes | Average: 5 out of 53 Votes | Average: 5 out of 53 Votes | Average: 5 out of 53 Votes | Average: 5 out of 5 (3 votos, promedio: 5 sobre 5)
Loading ... Loading ...

16 Responses to “Simulando el scroll del navegador con flash”


  1. 1 Dani Jan 18th, 2007 at 12:01 am

    Hola:

    El codigo está genial, como sería para una vez el scroll bajado subiera de manera automatica? alguién sabe comor??

    Chenkiu

  2. 2 Edwin Feb 23rd, 2007 at 3:27 pm

    Muy bueno el codigo y el scroll se ve estupendo. Ve pero tengo una pregunta como hago para crear un scroll asi para una ventana de texto
    me podrías colaborar en eso please.
    muchas gracias

  3. 3 handepora Mar 17th, 2007 at 2:47 pm

    Dani, para subir el scroll tienes que poner en 0 la posicion _y de drag_mc y de holder_mc. Yo lo hago así: (con las clases de Laco)

    drag_mc.tween("_y", 0, 1, "easeOutQuad");
    holder_mc.tween("_y", 0, 1, "easeOutQuad");

    Toni, tengo una duda, al usar las clases de Laco en vez de las de Zeh Fernando resulta que todo funciona igual excepto el movimiento al arrastrar el scroll, que no se mueve mientras arrastras como en tu ejemplo, si no cuando dejas de arrastrar.
    Cambié esta linea:
    holder_mc.ySlideTo (-y, 2, "easeOutQuart");
    por esta otra:
    holder_mc.tween("_y", -y, 1, "easeOutSine");
    ¿Alguna idea de qué estoy haciendo mal?
    Ojalá pudieras contestarme, si no lo pregunto por el foro.
    Genial el ejemplo, como siempre

    Un saludo

  4. 4 toni Mar 17th, 2007 at 3:53 pm

    Hola handepora,

    no sé que puede ser, acabo de probar con la clase de laco y el mismo método que tu y funciona bien.

    ¿Que versión de laco tweens utilizas?

    Si quieres te envio un ejemplo.

    saludos

  5. 5 handepora Mar 17th, 2007 at 5:54 pm

    Hola Toni, muchisimas gracias por contestar tan rápido.
    Te agradecería que me enviaras el ejemplo para ver si me funciona.
    Tengo la versión 1.2.0 y también tengo instalado el fuse kit, no se si tendrá algo que ver.
    Un saludo

  6. 6 Dani Mar 22nd, 2007 at 1:25 pm

    gracias handepora!! me va de lujo!!

  7. 7 Gonzalo Apr 11th, 2007 at 5:51 pm

    Hola, mi pregunta es que pasa cuando el "Alto" es variado; www.pierinc.com, en este sitio dependiendo del "Alto" de lo que muestras en el stage aparece o se alarga el scroll bar.. :(

  8. 8 toni Apr 13th, 2007 at 7:14 pm

    Hola Gonzalo,

    el funcionamiento del scroll es el siguiente:

    Si lo que contiene es más corto que la altura del navegador, no se muestra.

    Si lo que muestra es mas largo que la altura del navegador se muestra el scroll.

    Dale un vistazo a esto tambien:

    http://www.after-hours.org/2007/03/08/scroll-component/

    Saludos

  9. 9 domot May 17th, 2007 at 1:36 pm

    A ver, tengo un problemilla, el script va de lujo, es justo lo que estaba buscando, pero tengo un problema, al abrirse la pagina esta en la home y el texto es poco, con lo cual el scroll no esta, pero al entrar en una seccion, el texto aumenta, pero es scroll no sale porque ha detectado el tamaño del stage en el frame anterior, como puedo hacer para que rellame a la funcion y el scroll se adapte bien??

    Un ejemplo

    http://www.adhemas.com/

  10. 10 Aldo May 25th, 2007 at 1:43 am

    Toni, yo no quiero usar la clase mc_tween, reemplazo la linea como explicás al final del tuto pero el scroll, si bien se desliza, no hace bajar el contendio de la página. Tengo que borrar o agregar algo más?

    Saludos y gracias!!

  11. 11 toni May 25th, 2007 at 6:19 am

    Hola Aldo, tienes que substituir:

    Actionscript:
    1. holder_mc.ySlideTo (-y, 2, "easeOutQuart");

    por

    Actionscript:
    1. holder_mc._y = -y

    Saludos

  12. 12 domot May 28th, 2007 at 10:39 am

    como puedo hacer que el scroll sea controlable por la rueda del raton, he probado con on mousewheel pero no he conseguido asignarlo..?

  13. 13 toni May 28th, 2007 at 10:53 am

    Hola Domot,

    el ejemplo ya funciona con la rueda del ratón:

    http://www.after-hours.org/blog/2005/actionscript/browserScroll/

    ¿Utilizas PC o Mac?

    saludos

  14. 14 domot May 28th, 2007 at 11:48 am

    Mac, y no hay manera.
    Pero tienes razon lo he probado en pc y funciona a la perfeccion.
    Si sabes de alguna manera de que funcione con el mac tambien ya estara redondo ;-)

  15. 15 toni May 28th, 2007 at 12:33 pm

    En efecto, con Mac hay ese problema. He encontrado un enlace que te puede ser útil:

    http://blog.pixelbreaker.com/2006/11/08/flash/swfmacmousewheel/

    saludos

  16. 16 miguel Jun 27th, 2007 at 4:30 am

    muy bueno saludos

Leave a Reply




Subscribe

Subscribe to my RSS Feeds