Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gesture e TouchPanel

Rilevare ed elaborare i gesti sul TouchPanel del telefono
Rilevare ed elaborare i gesti sul TouchPanel del telefono
Link copiato negli appunti

Per rilevare i gesti sul TouchPanel del telefono, occorre introdurre una nuova variabile di tipo GestureSample a livello di classe, in grado di registrare gli input dell'utente:

[...]
GamePadState currGamePadState;
        
GestureSample gesture;
        
SpriteFont font;
[...]

Tra le proprietà esposte da GestureSample tre ci torneranno particolarmente utili in questa demo:

Proprietà Descrizione
GestureType Indica il tipo di gesto compiuto dall'utente
Position raccoglie le informazioni circa il punto di contatto sul device
Delta un vettore che indica la distanza tra due punti (nel flick, ad esempio, lo spostamento compiuto dal momento della pressione al momento del rilascio del contatto)

GestureType

Quanto ai tipi di gesti dell'utente che è possibile "intercettare", è importante ricordare che Windows Phone 7 supporta una serie di gesti predefiniti che ci semplificano di gran lunga la vita. Questi gesti sono elencati nell'enum GestureType:

public enum GestureType
{
  None = 0,
  Tap = 1,       // tocco singolo
  DoubleTap = 2, // doppio tocco rapido
  Hold = 4,
  HorizontalDrag = 8, // trascinamento orizzontale
  VerticalDrag = 16,  // trascinamento verticale
  FreeDrag = 32,      // trascinamento lungo i due assi
  Pinch = 64,  // il gesto di "pizzicare" lo schermo con due dita
  Flick = 128, // il gesto di trascinare il dito sullo schermo
  DragComplete = 256,  // drag concluso
  PinchComplete = 512, // pinch concluso
}

Position

Indica le coordinate del punto di contatto, espresse mediante un Vector2 (esiste anche una proprietà Position2, utilizzata dal solo pinch, per indicare la posizione del secondo dito).

Delta

È lo spostamento del tocco rispetto al punto iniziale. Nel caso di un flick, essa indica la velocità dello spostamento, espressa in pixel per secondo (esiste anche un Delta2 per indicare lo spostamento del secondo dito nel caso di un pinch).

Nota:: è anche possibile prescindere dai tipi predefiniti di gesti messi a disposizione dal framework per andare a leggere direttamente l'input "grezzo" sul touch panel mediante il metodo statico TouchPanel.GetState(), il quale ritorna una collezione di TouchLocation (ciascuna delle quali rappresenta uno specifico tocco sul device).

Alcuni approfondimenti sull'input in XNA si trovano sulle pagine della guida a XNA di HTML.it a firma di G. Maggiore e V. Boncinelli.

EnabledGestures

Prima di poter rilevare il tocco, è necessario specificare quali gesti ci interessano mediante la proprietà EnabledGestures della classe TouchPanel. (Attenzione! Non farlo comporta un'eccezione a runtime).

Questa proprietà permette di indicare uno ad uno i gesti supportati dal device, separandoli con l'operatore logico OR (|). Nel nostro caso, limitiamoci ad utilizzare i tre gesti più semplici: Tap, DoubleTap e Flick. Per questo, aggiungiamo la seguente riga nel costruttore di Game1.cs:

TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap | GestureType.Flick;

Già che ci siamo, aggiungiamo anche alcune variabili a livello di classe per memorizzare le informazioni sui gesti compiuti:

// salva le info relative al tipo di gesture
string gestureTypeText = "Touch not available yet";
// salva le info relative alla posizione del touch
string touchPositionText = "Touch not available yet";

Fatto questo, passiamo ad inserire, nel metodo Update, il codice necessario a rilevare i gesti compiuti dall'utente:

// Controlla che ci sia un nuovo gesture non processato
while (TouchPanel.IsGestureAvailable)
{
  // legge il touchPanel
  Gesture = TouchPanel.ReadGesture();
  // memorizza il tipo di gesture
  gestureTypeText = "Last gesture type: " + Gesture.GestureType.ToString();
  // se si tratta di un tap o di un doppio tap, salva la posizione del punto di contatto
  if (Gesture.GestureType == GestureType.Tap || Gesture.GestureType == GestureType.DoubleTap)
    touchPositionText = string.Format("X: {0} - Y : {1}", Gesture.Position.X, Gesture.Position.Y);
  // se è un flick, mostra  il delta
  else if (Gesture.GestureType == GestureType.Flick)
    touchPositionText = string.Format("Delta X: {0} - Delta Y: {1}", Gesture.Delta.X, Gesture.Delta.Y);
}

Non ci resta altro che scrivere a schermo il risultato delle nostre letture, utilizzando il solito metodo DrawString:

// GamePad Text
spriteBatch.DrawString(font, gamepadText, new Vector2(10, 20), Color.White);
// Touchpad Text
spriteBatch.DrawString(font, gestureTypeText, new Vector2(10, 60), Color.White);
spriteBatch.DrawString(font, touchPositionText, new Vector2(10, 100), Color.White);

La prima chiamata al metodo DrawString ci mostrerà il tipo dell'ultimo gesto compiuto dall'utente, mentre la seconda indicherà le coordinate X e Y del punto di contatto o, nel caso di un flick, il delta (ossia, come si è accennato, la velocità di spostamento espressa in pixels per secondo) per ciascuno degli assi.

Premiamo F5 ed ecco il risultato:

Figura 29. I dati degli eventi

(clic per ingrandire)

I dati degli eventi

Nulla ci vieta di ampliare il semplice esempio proposto, abilitando nuovi gesti alla proprietà TouchPanel.EnabledGestures e scrivendo a schermo la posizione e il delta del nuovo gesto.

Ti consigliamo anche