Tiago Barbosa

Gadgets, Silverlight, WPF, Surface, XNA, Azure...

Tutorial 3: O Básico do Multitouch em Silverlight 3

Ultimamente tenho andado a explorar algumas capacidades do Silverlight 3 com as quais ainda não tinha tido qualquer tipo de contacto apesar de as achar bastante interessantes. Uma delas é o multitouch. Tenho que vos confessar que estou bastante impressionado! É uma feature muito interessante e com muito potencial em várias áreas de aplicação. 

Para termos acesso a estas funcionalidades temos que ter o Windows 7 instalado no nosso PC e o PC tem que ter suporte para multitouch. A partir daí a nossa imaginação é o limite.

Neste post vou mostrar apenas um exemplo muito básico mas que mostra como podemos começar a desenvolver aplicações multitouch em Silverlight 3. 

Para começar a utilizar as capacidades de multitouch temos que adicionar em qualquer parte da nossa aplicação o seguinte evento:

Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

Atenção: 

Ao contrário dos eventos do rato (MouseLeftButtonDown, MouseLeftButtonUp, ...), este evento é global. Ou seja, é ligado a toda a nossa aplicação e não pode ser aplicado apenas a um objecto.

A partir deste momento a nossa aplicação está pronta a receber mensagens de toque por parte do hardware. Este evento permite-nos ter acesso a vários métodos mas os principais e que aqueles que serão usados neste post são: GetPrimaryTouchPoint e GetTouchPoints.

O GetPrimaryTouchPoint devolve o primeiro ponto que foi tocado no ecrã numa possível sequência de toques. E o GetTouchPoints devolve uma colecção de todos os pontos que estão a ser pressionados. 

Ambos os métodos devolvem objectos do tipo TouchPoint. Este obejecto permite-nos aceder a quatro valores. 

 

  • Position - Posição do toque em relação a um determinado offset. Se passarmos null ao chamar a função o valor devolvido é absoluto. 
  • Action - Existem três tipos de toque: Down, Move e Up. É bastante fácil perceber o que faz qualquer um destes eventos mas o evento Move não é tão trivial como parece. O evento Move está sempre a ser chamado mesmo que a posição do toque não seja alterada. Ou seja, existe um refresh constante deste evento.
  • TouchDevice - É o ID único que o sistema operativo atribui ao dispositivo que está a servir para o toque.
  • DirectlyOver - Devolve o objecto que está directamente no sítio pressionado.

 

Um pequeno exemplo de utilização é:

 

public MainPage()
  {
      InitializeComponent();
      Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
 }
  
 void Touch_FrameReported(object sender, TouchFrameEventArgs e)
 {
    TouchPointCollection points = e.GetTouchPoints(null);
    TouchPoint primaryPoint = e.GetPrimaryTouchPoint(null);

            if (null != primaryPoint)
            {
                if (primaryPoint.Action == TouchAction.Down)
                    e.SuspendMousePromotionUntilTouchUp();

                switch (primaryPoint.Action)
                {
                    case TouchAction.Down:
                        // fazer alguma coisa
                        break;

                   case TouchAction.Up:
                        // fazer alguma coisa
                        break;
               case TouchAction.Move:
                        // fazer alguma coisa
                        break;
                }
            }
 }

Com este pequeno exemplo estamos a aceder a todos os pontos que são pressionados no ecrã. Agora, e tal como disse no ínicio do post, o limite é a imaginação.

Criem e depois divulguem pois o conhecimento só serve de alguma coisa se o conseguirmos passar para as outras pessoas... ;)