DevCorner620

DevCorner: usiamo il TouchDelegate

Giuseppe Tripodi

Se vivessimo in un mondo perfetto non avremmo mai incontrato l’odioso problema di dover cliccare su bottoni troppo piccoli per le nostre dita. Allo stesso modo, se vivessimo in un mondo dove tutti gli sviluppatori Android conoscono le armi a loro disposizione, non saremmo mai incappati nella medesima situazione.

Visto che qui ad AndroidWorld lottiamo quotidianamente per un mondo migliore , in questa puntata del DevCorner vi spieghiamo come utilizzare il TouchDelegate.

Come accennato nell’introduzione, il TouchDelegate si occupa di espandere l’area cliccabile di una determinata view: infatti, può capitare molto spesso di dover mantenere tasti piccoli per ragioni di design ma realizzare comunque che per un migliore esperienza utente sarebbe il caso che non fosse necessario prendere la mira per eseguire un’operazione.

Il classico esempio è quello proposto anche da Roman Nurik: in caso di una listView in cui è possibile aggiungere ai preferiti degli elementi non possiamo concederci il lusso di inserire stelline enormi, ma allo stesso tempo non è consigliabile lasciare che la sola area cliccabile sia quella della (minuscola) icona. In casi come questi ci viene in aiuto il TouchDelegate, che ci consente di impostare che il click di una zona più estesa sia ricondotto a quello del nostro bottone.

È davvero molto facile da usare, come certamente capirete da voi guardando il nostro codice d’esempio: abbiamo inserito in un normalissimo RelativeLayout due (piccoli) tasti con il logo di AndroidWorld: il più in alto utilizza il nostro TouchDelegate (e riceve i click fino a oltre metà schermo), mentre il secondo…beh, si fa un po’ di fatica a cliccare il secondo.

Per farlo, dopo aver dichiarato i nostri due tasti, abbiamo utilizzato una generica view chiamata parent alla quale è stato associato il parent del primo tasto (vale a dire la view che lo contiene) tramite il metodo getParent(). Fatto questo, in un runnable abbiamo dichiarato un nuovo Rect (rettango) e, dopo aver ottenuto le dimensioni del bottone più in alto tramite il metodo getHitRect() abbiamo ampliato le il nostro rettangolo di 500 in ogni direzione.
Per concludere è stato sufficiente dichiarare un nuovo oggetto TouchDelegate al quale abbiamo passato il nostro rect e il tasto che vogliamo associare e impostare al parent l’oggetto appena creato con il metodo setTouchDelegate().
Una procedura talmente semplice che probabilmente è più comprensibile leggendo direttamente il codice:

public class MyActivity extends Activity implements View.OnClickListener{
    ImageView noTD;
    ImageView siTD;
    View parent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        noTD = (ImageView) findViewById(R.id.noTD);
        siTD = (ImageView) findViewById(R.id.siTD);
        parent = (View) siTD.getParent();
        siTD.setOnClickListener(this);
        noTD.setOnClickListener(this);
        parent.post(new Runnable() {
            public void run() {
                Rect rect = new Rect();
                siTD.getHitRect(rect);
                rect.top -= 500;
                rect.bottom += 500;
                rect.left -= 500;
                rect.right += 500;
                TouchDelegate touchDelegate = new TouchDelegate(rect,
                        siTD);
                parent.setTouchDelegate(touchDelegate);
            };
        });
    }

    @Override
    public void onClick(View view) {
         if(view.getId()==siTD.getId()) {
             Toast.makeText(this, "La potenza del TouchDelegate!", Toast.LENGTH_SHORT).show();
         }
        else
         {
             Toast.makeText(this, "Buhh! Niente TouchDelegate!?", Toast.LENGTH_SHORT).show();
         }

        }

    }

Per accertarci che il tutto funzionasse, ovviamente, abbiamo anche assegnato un Toast ad ognuno dei due tasti.

Il semplice DevCorner di questa settimana finisce qui: a volte basta davvero poco per migliorare sensibilmente l’esperienza utente! Per dare un’occhiata al progetto completo vi rimandiamo sul nostro forum, dove potrete anche chiedere una mano nel caso abbiate problemi con questo o qualsiasi altro tutorial.

Aiutateci a rendere il mondo un posto migliore e divertitevi con il TouchDelegate!