Quanto visto nel capitolo precedente riguardava esclusivamente eventi scatenati da un singolo puntatore; o meglio, considerato che ci stiamo riferendo alla mano dell'utente, da un
solo dito. Sono i cosiddetti eventi single touch. Molto frequenti sono comunque gli eventi multitouch, cioè quelli provocati dall'uso congiunto
di più dita. Si pensi a quando, per rimpicciolire un'immagine, puntiamo due dita sul display e senza sollevarle le avviciniamo tra loro.
Concettualmente il multitouch nelle app Android presenta gli stessi fondamenti del suo "cugino" single. Ugualmente si farà uso di:
- TouchEventListener per designare il componente incaricato di ricevere gli eventi relativi al touch;
- onTouchEvent sarà il metodo nel quale verranno recapitate le informazioni relative all'evento rilevato;
- MotionEvent sarà la tipologia di oggetto che veicolerà le informazioni acquisite come posizioni dei puntatori e tipologie di evento.
La differenza starà nel fatto che dovranno essere rese contemporaneamente disponibili tutte le informazioni sulla posizione dei singoli puntatori. Ciò permetterà in questa sede di approfondire la struttura di MotionEvent che, probabilmente, quando si tratta il semplice single touch appare molto più elementare di quello che realmente sia.
Si consideri innanzitutto che tutte le dita poggiate contemporaneamente sul display costituiscono con i loro movimenti una "gestualità" complessiva. Il MotionEvent assegnerà un ID ad ogni puntatore e se ne servirà per distinguere le informazioni raccolte per ognuno di essi.
All'interno del metodo onTouchEvent risulteranno molto utili i seguenti metodi di MotionEvent:
- getPointerCount: restituisce il numero di puntatori attualmente sul display;
- getActionIndex: fornisce l'indice del puntatore che viene trattato in questa singola invocazione di onTouchEvent;
- getPointerId: restituisce l'id del singolo puntatore indicato dall'indice passato in input, solitamente fornito da getActionIndex;
- getX e getY: servono a recuperare le coordinate del singolo puntatore indicato dall'indice, anche in questo caso, ottenuto con getActionIndex;
- getActionMasked: ritorna il codice identificativo del tipo di azione compiuta.
Per quanto riguarda gli eventi, nel capitolo precedente, avevamo attuato un'analisi del click su schermo suddividendolo nelle fasi di ACTION_DOWN (posare
il dito sullo schermo) e ACTION_UP (sollevare il dito). Nel multitouch, la filiera delle fasi da osservare sarà leggermente più lunga:
- ACTION_DOWN: rappresenta l'inizio del movimento. Corrisponde al primo puntatore che tocca lo schermo. Le informazioni corrispondenti si troveranno
all'indice 0 del MotionEvent; - ACTION_POINTER_DOWN: per ogni altro puntatore, dopo il primo, che toccano lo schermo nella stessa "gestualità". Il metodo getActionIndex() fornirà la
posizione nel MotionEvent che contiene i dati di questo singolo evento; - ACTION_MOVE: non vengono aggiunti puntatori ma avviene un cambiamento, come uno spostamento;
- ACTION_POINTER_UP: segnala che un puntatore non primario, ossia uno che ha toccato il display dopo il primo, viene sollevato;
- ACTION_UP: invocato quando anche il primo puntatore, quello che ha dato inizio al movimento, è stato sollevato. La gestualità si è completata.