¿Quieres registrarte?

Multitouch con Adobe AIR 2, Flash Lite 4 y Flash Player 10.1

Por: eldervaz
22 de Febrero del 2010

Con las novedades del Flash Player 10.1, Flash Lite 4 y AIR 2.0 existe una que a los usuarios de iphone o macbook les debe ser muy familiar, el multitouch. En este tip enseñaremos como utilizar la clase TransformGestureEvent que nos permite zoom y rotar elementos. Para eso necesitamos Flash Builder con el SDK de AIR 2.0 que ya pueden descargar del sitio Adobe Labs. Cuando Flash CS5 sea liberado, también podrán usarlo para sus aplicaciones.



Una vez configurado el SDK de AIR 2.0, creamos un proyecto FLEX del tipo Desktop (Adobe AIR) y lo primero que haremos es cargar una imagen que usaremos de ejemplo:

Código :

var l:Loader = new Loader();
l.load(new URLRequest("logo.png"));
l.x = l.y = -100;
$__img1 = new Image();
$__img1.addChild(l);
this.addElement($__img1);
$__img1.x = $__img1.y = 200;


Con eso agregamos un elemento a nuestro stage de la aplicación, y ahora pasamos a agregar un evento para que detecte la rotación, usaremos el evento TransformGestureEvent del tipo GESTURE_ROTATE

Código :

this.addEventListener(TransformGestureEvent.GESTURE_ROTATE, _rotation, false, 0, true);


Este evento se dispará cuando se detecte los dos dedos sobre el stage y hagas el movimiento de rotación

Código :

private function _rotation(e:TransformGestureEvent):void{
$__img1.rotation += e.rotation;
}


Ahora, si queremos usar el zoom o escalar los elementos abriendo o cerrando los dedos sobre el stage usamos GESTURE_ZOOM del evento TransformGestureEvent.

Código :

this.addEventListener(TransformGestureEvent.GESTURE_ZOOM, _zoom, false, 0, true);

Y creamos su función:

Código :

private function _zoom(e:TransformGestureEvent):void
{
   if (e.scaleX > 1)
   {
      $__img1.scaleX += e.scaleX / 100;
      $__img1.scaleY += e.scaleY / 100;
   }
   else
   {
      $__img1.scaleX -= e.scaleX / 100;
      $__img1.scaleY -= e.scaleY / 100;
   }
}

Aquí es necesario un IF porque siempre está detectando que el zoom actual es 1 cada vez que interactuas, entonces si juntas los dedos al momento de querer hacer ZoomIN, irá de 1.0, 0.9, 0.8 así sucesivamente.

La aplicación final quedaría así:

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  creationComplete="init()"
                  width="320"
                  height="400">

   <fx:Script>
      <![CDATA[
         import mx.controls.Image;
         private var $__img1:Image;

         //
         private function init():void
         {
            var l:Loader=new Loader();
            l.load(new URLRequest("logo.png"));
            l.x=l.y=-100;
            $__img1=new Image();
            $__img1.addChild(l);
            this.addElement($__img1);
            $__img1.x=$__img1.y=200;
            //
            $__img1.addEventListener(MouseEvent.MOUSE_DOWN, activeMove, false, 0, true);
            $__img1.addEventListener(MouseEvent.MOUSE_UP, activeMove, false, 0, true);
            this.addEventListener(TransformGestureEvent.GESTURE_ROTATE, _rotation, false, 0, true);
            this.addEventListener(TransformGestureEvent.GESTURE_ZOOM, _zoom, false, 0, true);
         }

         private function _rotation(e:TransformGestureEvent):void
         {
            $__img1.rotation+=e.rotation;
         }

         private function _zoom(e:TransformGestureEvent):void
         {
            if (e.scaleX > 1)
            {
               $__img1.scaleX+=e.scaleX / 100;
               $__img1.scaleY+=e.scaleY / 100;
            }
            else
            {
               $__img1.scaleX-=e.scaleX / 100;
               $__img1.scaleY-=e.scaleY / 100;
            }
         }

         private function activeMove(e:MouseEvent):void
         {
            if (e.type == MouseEvent.MOUSE_DOWN)
               $__img1.startDrag();
            else if (e.type == MouseEvent.MOUSE_UP)
               $__img1.stopDrag();
            else
               throw new Error("upsss!!!");
         }
      ]]>
   </fx:Script>
</s:WindowedApplication>

Puedes descargar el ejemplo aquí, necesitas tener el runtime de AIR 2

 


También te interesa


Etiquetas flex air actionscript_3 flashlite flashplayer 10.1 multitouch

Comentarios | Enviar un comentario
Esta nueva posibilidad de AIR abre un montón de posibilidades, está genial :P
Buen tip Elder (y)
Por: Zguillez
Ok, en este momento, es posible usar ese ejemplo en un Ipod Touch??
Por: rolv

ramiro_olvera :

Ok, en este momento, es posible usar ese ejemplo en un Ipod Touch??
Tendrías que torrentear conseguir Flash CS5 beta, usar el compilador de apps Flash para iPhone e insertarla en tu Touch usando el SDK.
Por: Freddie
Muy bueno elder, como siempre.
Mi pregunta es porque en la primera parte del codigo, creas $__img1
y a esta le haces el addChild del elemento que cargaste?' que diferencia tiene con utilizar directamente la var l con la que has cargado, o sea, porque no utilizas el comun:

Código :


var l:Loader = new Loader(); 

l.load(new URLRequest("logo.png")); 

l.x = l.y = -100;

addChild(l):


Desde ya gracias. Saludos
Por: bubudrc
@bubudrc hola, nada del otro mundo, sólo poder acceder a lo métodos y propiedades de un Sprite, por ejemplo starDrag();
Por: eldervaz
@eldervaz, muchas gracias por tu respuesta. La verdad es que nunca lo había manejado de esa forma, pero será cuestión solo de investigar un poco más. Muchas gracias.
Por: bubudrc
eldervaz, yo hice unas pruebas con esta nueva api y la verdad es que no logre usar multiples dedos, solo con un dedo. Es cierto o simplemente me habra faltado algo.!
Por: Zandy
disculpa 2 dedos maximo.... :-)
Por: Zandy
@Zandy, según se la cantidad de dedos que puedes utilizar en este tipo de aplicaciones, depende totalmente del medio.
Es decir, la superficie en donde estas tocando determina la cantidad máxima que detecta. Algunos usan 2 otros 5, pero depende del dispositivo en que corras la aplicación.
Puedes fijarte en la lista de preguntas frecuentes que ha contestado Lee Brimelow en su blog.

Saludos
Por: bubudrc
Vaya, yo tambien probe con un HP TouchSmart, gracias bubudrc, realmente lo que necesitaba saber acerca del tema

salu2
Por: Zandy
@Zandy hola, espero que tus dudas estén resueltas por Lee, igual, este post es más de programación, estoy preparando uno nuevo más de capacidades y limitantes :) espero el fin de semana terminarlo
Por: eldervaz
wow, con ansias espero a este fin de semana.. :-), pues hay una cantidad de equipos de esta naturaleza y no todos hablan en el mismo idioma. ( Podra fp10.1 transparentar esto ? )
Por: Zandy

Zandy :

wow, con ansias espero a este fin de semana.. :-), pues hay una cantidad de equipos de esta naturaleza y no todos hablan en el mismo idioma. ( Podra fp10.1 transparentar esto ? )

No, funciona deacuerdo al dispositivo :( ya lo verás en mi post :)
Por: eldervaz
me quede esperando eldervaz :(
Por: Zandy
Hola, entiendo que detras de todo esto hay muchos puntos que revisar, no se si valdria la pena tocar estos puntos, por ejemplo:
1.- funciona con pantallas tactiles como touchsmart? el ejemplo de que esto es solo con ciertos dispositivos esta en: http://gestureworks.com/

2.-funciona con TUIO? si es el caso es necesario la instalacion de camaras firewire? el ejemplo de esto esta en: http://www.nuiteq.com/products/snowflakesuite.php

he estado trabajando mucho en el software del punto 2 y he logrado hacer funcionar este software y es una maravilla pero tiene sus limitantes como desarrollar tus propias aplicaciones y cuando lo haces tienes que compilar con el SDK de este software para que trabaje, cosa que no he logrado, volviendo al tema valdria la pena iniciar desde los principios basicos para aclarar muchas dudas.

saludos

Jorge
Por: Jorge-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.