Le gesture sono uno dei principali meccanismi di interazione tra utente e applicazione mobile. Si tratta di movimenti delle dita sul display che
vengono percepiti dal dispositivo.
Le gesture più diffuse – sia su Android che su altri sistemi operativi mobili - non sono molte, e possono essere classificate come segue:
-
pressioni: sono quelle più naturali e contemplano il classico touch (il corrispondente di un click del mouse), il doppio tocco
e la pressione prolungata; -
lo swipe: consiste in un tocco prolungato del dito con il contemporaneo scorrimento laterale. L'abbiamo visto in un capitolo precedente
come meccanismo principale di scorrimento delle pagine del ViewPager; -
pinch: è il tipico meccanismo usato per ingrandire o ridimensionare l'immagine che appare nel display. Si effettua con una pressione di
due dita che, senza staccarsi dalla superficie, si allontanano (pinch open) o si avvicinano tra loro (pinch close).
La diffusione del multitouch ed il vasto impiego delle gesture nelle app mobile le hanno rese un linguaggio di interazione comune a tutti i sistemi
operativi per smartphone o tablet.
Il programmatore, analizzando i tocchi effettuati dall'utente sul display mediante dita o altri puntatori, potrebbe anche decidere di inventare nuove gesture. È bene sottolineare, però, che questa è una tentazione cui non si dovrebbe cedere, nei limiti del possibile, in
quanto l'utente usa spontaneamente le gesture cui ha fatto già l'abitudine. Inventarne di personali potrebbe portare ad un'app piuttosto criptica e poco
usabile.
Su Android esiste una classe, chiamata GestureDetector
, che permette di intercettare ed interpretare le gesture più comuni, per ognuna delle quali
viene offerto un apposito metodo di callback: onLongPress
, onFling
, onScroll
, etc.
Esempi di utilizzo sono già stati forniti nel corso della Guida Android pubblicata su
questo sito, cui si rimanda per eventuali approfondimenti.
Swipe to Refresh
Un meccanismo che si è diffuso molto negli ultimi tempi per la sua intuitività è il cosiddetto pull-to-refresh: esso consiste
nell'aggiornamento dei contenuti mostrati nell'app con un movimento del dito che resta premuto sull'interfaccia e viene trascinato verso il basso ( swipe gesture). La diffusione di tale meccanismo è così comune che l'utente medio si aspetta di trovarlo incluso in un’app Android moderna.
Fino a poco tempo fa, il pull-to-refresh poteva essere integrato nel proprio progetto riconoscendolo “manualmente” – cioè interpretando i touch
effettuati sul display e le relative tempistiche – oppure affidandosi ad una delle tante librerie di terze parti disponibili on-line.
Android ha preso atto della diffusione di questa tecnica aggiungendo una nuova classe alla revisione 19 della Support Library (marzo 2014): SwipeRefreshLayout
.
Si tratta di un layout che offre la possibilità di inserire al suo interno una sola View e di gestire l'evento di pull per aggiornare i
dati presentati.
L'utilizzo di tale layout è piuttosto semplice:
-
lo si deve impostare in una risorsa /res/layout, attingendo alla libreria di supporto. Il nodo XML da utilizzare sarà
<android.support.v4.widget.SwipeRefreshLayout>
; -
nel codice Java l'unica operazione da svolgere consiste nell'impostazione di un listener di classe
OnRefreshLayout
il cui metodoonRefresh
conterrà le operazioni di aggiornamento (per esempio, il download di nuovi dati dalla rete).
La classe SwipeRefreshLayout
possiede un altro metodo, setRefreshing
, con il quale il programma definisce in quali momenti l'app si troverà in fase di
aggiornamento. Tipicamente, la prima operazione che viene svolta nel metodo onRefresh del listener è setRefreshing(true)
. Al termine dell'aggiornamento, si
invoca invece setRefreshing(false)
.
Durante l’aggiornamento, il layout mostrerà un'animazione nella quale si alterneranno i colori che possono essere definiti con il metodo
setColorSchemeResources
. Tale metodo riceverà un elenco di id che distingueranno le risorse di tipo colore che potranno essere utilizzate.
Il seguente codice mostra schematicamente l'uso che si fa di questa classe in Java:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SwipeRefreshLayout swipe = (SwipeRefreshLayout) findViewById(R.id.swipe);
swipe.setColorSchemeResources( /* risorse colore da alternare durante le animazioni */ );
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
swipeView.setRefreshing(true);
// Codice per l'aggiornamento dei dati
swipeView.setRefreshing(false);
}
});
}
Nel codice precedente, il layout activity_main contiene uno SwipeRefreshLayout
con id R.id.swipe
.