Comunidad de diseño web y desarrollo en internet online

drag, drog y rollover

Citar            
MensajeEscrito el 03 Dic 2009 03:43 pm
Muy buenas gente!!
Tengo un problemita y me gustaria que me echarais una mano.
Tengo en el stage una serie de iconos. Éstos puedo arrastrarlos a un contenedor para introducirlos dentro.
Puedo meter en el contenedor tantos como quiera de cada icono.
Por ahora se me añaden unos detras de los otros formando una columna.
El problema es que me han pedido que, si se quiere, se puedan introducir iconos entre medio de los que estan ya en el contenedor.
He probado de mil maneras, y ninguna me funciona.
La mas logica que de las que he probado era que a los iconos que están dentro del contenedor les doy un listener, que es un mouse_over.
Tenia pensado que cuando empezase a arrastrar debia de activar una variable para que supiese que estoy arrastrando (y no ejecutase la accion mouse_over si no arrastro), y en ese momento, si paso por encima de uno de los iconos que esta en la lista, se debe de mover hacia abajo el icono sobre el que estoy (y los que le siguen).
El problema creo que es que como estoy arrastrando un icono, el puntero se encuentra todo el rato sobre ese icono arrastrado, y no detecta que esta sobre los iconos del contenedor.
Pensé en ese momento en que cuando se empezara a arrastrar debia poner icono.mouseEnabled a false, y mas adelante, cuando soltase (mouse_up) ponerlo otra vez a true.
Esto tampoco sale, no se porque. Lo que ocurre es que mouseEnabled se queda en false, con lo que no se deja de arrastrar el icono hacia todos los lados.
Aqui os pongo un trozo de uno de los codigos que probé (he probado tantos ya que no sabia si debia poneros alguno, porque ya no se ni cual es mejor :( ) :

Código ActionScript :

...
...
...
private var elemDesplaz:Number = 0;//Esta variable es para saber donde tengo que colocar el icono al soltar
      private function moverElemLista(e:MouseEvent):void
      {
         elemDesplaz = 0;
         var i:Number = 0;
         if (drg)
                        {
                           //la variable numero es el indice, se le da al añadirlo al contenedor. Asi no tengo que escribir tanto.
            elemDesplaz = i = listaAcciones.listaInterna.getChildAt(e.target.numero);
            while (i < listaAcciones.listaInterna.numChildren)
            {
            if (listaAcciones.listaInterna.getChildAt(i).y <= (listaAcciones.listaInterna.getChildAt(i-1).y + 40))
            {
               listaAcciones.listaInterna.getChildAt(i).y += 40;
               listaAcciones.listaInterna.getChildAt(i).numero++;
            }
            i++;
            }
                        }
      }
      
                private var drg:Boolean = false;
      public function drag(e:MouseEvent):void
      {
         e.target.startDrag();
         drg = true;
      }
      
      public function drop(e:MouseEvent):void
      {
         e.target.stopDrag();
                        drg = false;
         
         if (((e.target.x > listaAcciones.x) && (e.target.x < (listaAcciones.x + listaAcciones.width))) && ((e.target.y > listaAcciones.y) && (e.target.y < (listaAcciones.y + listaAcciones.height))))
         {            
            switch (e.target.accion)
            {
               case "Avanzar":
                  var aux:btnAvanzar = new btnAvanzar();
                  aux.addEventListener(MouseEvent.MOUSE_OVER, moverElemLista);
                  aux.name = "aux" + itemVectorAcciones;
                  aux.numero = itemVectorAcciones;
                  aux.addEventListener(MouseEvent.CLICK, seleccionarEnLista);
                  listaAcciones.listaInterna.addChild(aux);
                  if (elemDesplaz)
                  {
                     listaAcciones.listaInterna.getChildAt(itemVectorAcciones).y = (elemDesplaz * 40);
                  }
                  else
                  {
                     listaAcciones.listaInterna.getChildAt(itemVectorAcciones).y = (40 * (listaAcciones.listaInterna.numChildren - 1));
                  }
                  aux.posYObjetoLista = listaAcciones.listaInterna.getChildAt(itemVectorAcciones).y;
                  aux.posXObjetoLista = listaAcciones.listaInterna.getChildAt(itemVectorAcciones).x;
                  
                  moverLista();
                  
                  break;
...
...
...


Ya se que hay cosas que me darian fallo o que se deben mejorar, pero primero quiero que funcione lo basico y luego ya tendre tiempo de pulir el código.
Como ya he dicho, se me han ocurrido mas formas de hacerlo, pero son todas muy similares.
Por ejemplo, tambien hice un codigo que miraba la posicion del cursor y contaba todos los elemetos de la lista (o contenedor) hasta que encontraba el que tenia una posición ".y" mayor. En ese momento paraba de mirar que elementos eran y empezaba a mover los elementos desde el ultimo encontrado.
Esta manera no estaba mal del todo, pero no acaba de funcionar como tocaba. El código era muy similar al otro. Esta era la mayor diferencia:

Código ActionScript :

...
...
...
private function movTemp(e:MouseEvent):void
      {
         elemDesplaz = 0;
         var i:Number = 0;
         while ((drg) && (i < listaAcciones.listaInterna.numChildren) && (listaAcciones.listaInterna.getChildAt(i).y < mouseY))
         {
            i++;
         }
         elemDesplaz = i;
         while (i < listaAcciones.listaInterna.numChildren)
         {
            if (listaAcciones.listaInterna.getChildAt(i).y <= (listaAcciones.listaInterna.getChildAt(i-1).y + 40))
            {
               listaAcciones.listaInterna.getChildAt(i).y += 40;
               listaAcciones.listaInterna.getChildAt(i).numero++;
            }
            i++;
         }
      }

Sigo pensando que el mayor problema es que no me detecta el cursor sobre los iconos del contenedor porque éste está sobre el icono que está arrastrando. Pero ya no se como darle mas vueltas y que salga de cara.
Así que esto es todo.
Lo siento si me ha quedado largo, pero quería explicarme bien.
A ver si alguien me puede ayudar. Muchas gracias!
Saludos!

Por SeiyaJapon

54 de clabLevel



 

España

safari
Citar            
MensajeEscrito el 03 Dic 2009 04:41 pm
Ya probaste con un ROLL_OVER en lugar de MOUSE_OVER??

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Dic 2009 10:32 pm
Siento responder tan tarde, pero estaba incomunicado.
Lo primero: todo gracias por contestar. Y ahora...

Si, si que lo he probado.
Ahora lo que estoy haciendo es darle el listener al icono que arrastro. Pero esta vez es un mouse_over el que uso. Y lo que detecto es si esta encima del contenedor. Una vez esta situado encima lo que hago es contar hasta que elemento esta, como en la version ultima que os he comentado.
De esta manera funciona practicamente bien. Ahora la estoy puliendo.

Por SeiyaJapon

54 de clabLevel



 

España

safari

 

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