Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 26 di 53
  • livello principiante
Indice lezioni

Il TouchPanel

Gli eventi generati dal display di Windows Phone
Gli eventi generati dal display di Windows Phone
Link copiato negli appunti

Il TouchPanel ci permette di leggere lo stato dell'input sul display sensibile al tocco di un Windows Phone. Tale display supporta almeno quattro tocchi in contemporanea, ma potrebbe supportarne anche di più a seconda del modello di telefono.

Il touchscreen è molto particolare, in quanto non è né continuo né discreto: a seconda di come l'utente esegue il tocco (un tocco rapido oppure un trascinamento) il risultato sará interpretabile come una informazione discreta oppure continua. Addirittura in alcuni giochi sta emergendo la possibilitá di usare lo schermo del telefono come se supportasse dei thumbsticks, interpretando piccoli trascinamenti e pressioni prolungate in certe aree dello schermo come i movimenti di un thumbstick rilevando la distanza della pressione dal centro del thumbstick virtuale:

Figura 40. Thumbstick virtuale
Thumbstick virtuale

La classe TouchPanel (inclusa nel namespace Microsoft.Xna.Framework.Input.Touch) espone alcune proprietà statiche particolarmente interessanti, in quanto consentono di impostare il sistema di coordinate del TouchPanel in modo da tenere conto, ad esempio, delle operazioni di rotazione del device. Si tratta delle seguenti proprietà:

int DisplayWidth { get; set; }
int DisplayHeight { get; set; }
DisplayOrientation DisplayOrientation { get; set; }

DisplayWidth e DisplayHeight consentono di specificare le dimensioni dell'area di input, mentre la terza proprietà consiste in un enum di tipo DisplayOrientation che può assumere i seguenti valori:

Default = 0,
LandscapeLeft = 1,
LandscapeRight = 2,
Portrait = 4,

come si può intuire dal nome, DisplayOrientation indica l'orientamento del dispositivo di touch e, di conseguenza, in quale punto si colloca l'origine del sistema di coordinate (0,0). Quest'ultimo non deve necessariamente coincidere con il punto di origine utilizzato per le operazioni di disegno a schermo. Ad esempio, se abbiamo impostato il device per supportare la modalità Portrait e aggiungiamo le seguenti righe:

TouchPanel.DisplayOrientation = DisplayOrientation.LandscapeLeft;
TouchPanel.DisplayWidth = 800;
TouchPanel.DisplayHeight = 480;

Vedremo che l'origine degli assi X e Y per il dispositivo touch sarà collocato nell'angolo in alto a destra, mentre le operazioni di disegno continueranno ad avere la loro origine nell'angolo in alto a sinistra.

Per acquisire informazioni sullo stato e sulle capacità del touch pad, TouchPanel mette a disposizione il metodo statico

TouchPanel.GetCapabilities()

il quale ritorna una struttura di tipo TouchPanelCapabilities. A sua volta, tale struttura espone due proprietà interessanti:

Proprietà TouchPanelCapabilities Descrizione
bool IsConnected {get;} da non confondere con la proprietà IsGestureAvailable esposta dalla classe TouchPanel (di cui ci occuperemo fra breve) tale proprietà indica se il device effettivamente supporta il dispositivo di touch
int MaximumTouchCount {get;} permette invece di determinare il numero massimo di punti di contatto che possono essere "intercettati" contemporaneamente dallo specifico device utilizzato (4 o più nel caso di Windows Phone 7)

Leggere l'input con GetState

Un primo modo, invero piuttosto "grezzo", di leggere l'input proveniente dal touch panel consiste nell'utilizzare il metodo statico TouchPanel.GetState(), che ritorna una collezione di tipo TouchCollection:

public struct TouchCollection : IList, ICollection, IEnumerable, IEnumerable

Una TouchCollection non è altro che una collezione di TouchLocation, ciascuna delle quali a sua volta rappresenta un singolo tocco sullo schermo.

TouchCollection implementa una serie di interfacce che consentono di:

  • aggiungere o togliere elementi alla collezione (TouchCollection.Add, TouchCollection.Remove e TouchCollection.RemoveAt)
  • cercare un elemento per ID (TouchCollection.FindByID)
  • scorrere la collezione di TouchLocation mediante un ciclo for o foreach (grazie all'implementazione dell'interfaccia IEnumerable<TouchLocation>)
  • .

Ciascuna TouchLocation contiene una serie di informazioni relative al singolo tocco. In particolare:

Proprietà di TouchLocation Descrizione
int Id {get;} Rappresenta l'id di ciascun singolo tocco, in modo da poter identificare univocamente lo stesso tocco anche tra successivi passaggi dal metodo Update
Vector2 Position {get;} Contiene le informazioni (in float) circa la posizione del tocco lungo i due assi X e Y
TouchLocationState State {get;} Indica lo stato di un tocco, ossia se il punto di contatto è ancora premuto, se è stato rilasciato, oppure se si sta spostando:

public enum TouchLocationState
{
  Invalid = 0,
  Released = 1,
  Pressed = 2,
  Moved = 3,
}

Ti consigliamo anche