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... ;)