Image
9.7.2016 0 Comments

Seriál: Programujeme pre Android 21 / Viacdotykové ovládanie a ovládanie svetla

Zámysel prípravy článku o viacdotykovom ovládaní vznikol na základe hesla „škola hrou“ a to najmä preto, že sa v ňom budeme venovať jednoduchej, avšak veľmi užitočnej vlastnosti (feature) systému Android. Touto vlastnosťou, resp. metódou vstupu je viacdotykové (multi-touch) ovládanie, alebo tiež systém gést (gestures). V úvode si povieme pár viet o tejto zaujímavej metóde interakcie používateľa so systémom. Budeme pokračovať uvedením vzorky praktického príkladu implementácie uvedenej metódy. Nakoniec si ozrejmíme akým spôsobom možno prepojiť fyzické zariadenie s emulátorom. Práve to potrebujeme pre nahradenie absentujúcich funkcií emulátora.

Multi-Touch Gestures

Pod pojmom viacdotykové ovládanie rozumieme použitie viacerých ukazovateľov (pointers), ktoré v rovnakom čase vytvoria dotykové udalosti (touch events). V prípade dotykových obrazoviek smartfónov ide o súčasné dotknutie sa obrazovky na viacerých miestach. Je pritom jedno či použijeme prsty našej ruky, dotykové perá, alebo inú kombináciu ukazovateľov. Operačný systém rozoznáva, že používateľ sa dotýka obrazovky viacerými ukazovateľmi a po vykonaní analýz generuje príslušné typy udalostí. V prípade Androidu ide o nasledujúce elementárne udalosti:

ACTION_DOWN

prvý ukazovateľ sa dotkol obrazovky

ACTION_POINTER_DOWN

ďalší ukazovateľ sa dotkol obrazovky

ACTION_MOVE

zmena polohy ukazovateľa počas dotyku

ACTION_POINTER_UP

jeden z ukazovateľov ukončil dotyk

ACTION_UP

posledný ukazovateľ ukončil dotyk

 

Systém pre každý ukazovateľ uchováva jeho index – poradie prvku poľa, v ktorom sú uložené informácie o pohybových udalostiach (MotionEvents) vyvolaných príslušným ukazovateľom. Každý ukazovateľ je naviac identifikovaný pomocou jeho ID. ID je jedinečné, avšak index sa môže meniť v závislosti na poradí, v ktorom boli vyvolané príslušné pohybové udalosti.

Okrem jednoduchých dotykov, ktorými vykonávame základné výberové funkcie, nám Android ponúka skupinu špeciálnych gést akými je napr. posun a pustenie (drag and drop, scroll), zväčšovanie/zmenšovanie (scaling), dlhý dotyk (long press)...

Detekcia obvyklých gést

Systém autodetekcie obvyklých, resp. bežne používaných gést je založený na nasledujúcom mechanizme:

1. získavanie informácií o dotykových udalostiach:

Vždy keď sa používateľ dotkne obrazovky je systémom vykonaná callback metóda onTouchEvent() patriaca tomu View, ktorý konkrétny dotyk prijal.

2. interpretácia získaných údajov vo forme konkrétneho gesta:

Obvyklé gestá sú spracovávané v rámci triedy GestureDetector. Tá podporuje základné gestá akými sú onDown(), onScroll(), onLongPress(), onFling()… O interpretácii a výbere konkrétneho gesta systém informuje notifikáciou prostredníctvom callback rozhrania GestureDetector.OnGestureListener, resp. triedy SimpleOnGestureListener, ktorá implementuje všetky metódy on a ukončuje ich pomocou výrazu return false; To znamená, že štandardne nereaguje na žiadnu z udalostí a výber tak necháva na programátorovi. V špecifických prípadoch dokážeme tento stav docieliť aj v rámci triedy OnGestureListener a to tak, že do jej metódy onDown() takisto zahrnieme výraz return false;

Obr. 1 Ovládanie emulátora pomocou fyzického zariadenia s využitím aplikácie SDK Controller

Vzorka praktického príkladu

Praktická implementácia viacdotykového ovládania vykonávajúceho zmenu veľkosti (scale) imageView je nasledujúca:

1. definujeme metódu onScale() triedy SimpleOnScaleGestureListener, napr.:

private class scaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

  @Override

  public boolean onScale(ScaleGestureDetector detector) {

    float scaleFactor = detector.getScaleFactor();

    matrix.postScale(scaleFactor, scaleFactor);

 

    imageView.setScaleType(ImageView.ScaleType.MATRIX);

    imageView.setImageMatrix(matrix);

 

    return true;

  }

}

2. vytvoríme inštanciu triedy ScaleGestureDetector s priradením nami implementovaného „načúvača“ (listener) – ide o objekt nami pripravenej triedy scaleListener:

scaleGestureDetector = new ScaleGestureDetector(getActivity(), new scaleListener());

3. definujeme metódu onTouch() konkrétneho imageView:

imageView.setOnTouchListener(new View.OnTouchListener() {

  @Override

  public boolean onTouch(View v, MotionEvent event) {

    scaleGestureDetector.onTouchEvent(event);

 

    return true;

  }

});

Prepojenie fyzického zariadenia s emulátorom

Pri práci v prostredí Android Studia dokážeme spúšťať nami vytvorené aplikácie s využitím AVD manažéra. Tento nástroj (emulátor) je určený na správu virtuálnych zariadení. Jednou z jeho mnohých výhod je možnosť otestovania aplikácií na rôznych emulovaných zariadeniach. Čo však v prípade ak chceme simulovať viacdotykové ovládanie v rámci emulátora?

Možností je niekoľko pričom veľmi elegantné a naviac lákavé a zaujímavé je prepojenie fyzického zariadenia s virtuálnym. Toto prepojenie realizujeme pomocou nasledujúcich krokov:

1. pripojíme fyzické zariadenie k PC pomocou USB a v zariadení povolíme Nastavenia -> Vývojárske možnosti -> Ladenie zariadenia USB (USB Debugging)

2. do zariadenia nainštalujeme aplikáciu SDK Controller:

Android/Sdk/platform-tools/adb install Android/Sdk/tools/apps/SdkController/bin/SdkControllerApp.apk

3. Na príkazový riadok v PC zadáme príkaz, ktorým povolíme odovzdávanie spojenia (forward socket connections):

Android/Sdk/platform-tools/adb forward tcp:1970 localabstract:android.sdk.controller

4. Na zariadení spustíme aplikáciu SDK Controller a stlačíme tlačidlo Control Multi-touch

5. Na príkazový riadok v PC zadáme príkaz, ktorým spustíme emulátor a jeho konkrétne virtuálne zariadenie (v našom prípade s názvom „Samsung“) s emuláciou multi-touch obrazovky:

Android/Sdk/tools/emulator-x86 -avd Samsung -screen multi-touch -gpu off

Pozn.: pre zrušenie odovzdávania spojenia zadáme na príkazový riadok v PC príkaz:

Android/Sdk/platform-tools/adb forward --remove-all

Zobrazit Galériu
Autor: Marek Sopko

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro 1

Rozšírená realita pomôže školám

17.12.2016 00:05

Raz vidieť je lepšie ako stokrát počuť a v školstve to platí ešte mnohonásobne viac. Čo však v prípade, ak si študenti majú pozrieť, ako v reálnom čase pracuje jadrový reaktor? Alebo by chceli vidieť, ...

ITPro

Linux súkromne i pracovne v2.0 (15. časť): SIP (Session Initiation Protocol)

13.12.2016 11:58

Je priam neuveriteľné, aké množstvo užitočných informácií a faktov súvisiacich s IP telefóniou (VoIP) sa skrýva za takou jednoduchou skratkou, ako je SIP. Nejde pritom iba o protokol, ale o mnoho ďalš ...

ITPro

Výzvy a perspektívy mobilných sietí

13.12.2016 11:52

Dostupnosť kvalitného mobilného pripojenia vrátane dostatočnej kapacity na prenos dát považujeme v súčasnosti za samozrejmosť.  O niektorých špecifikách a  perspektívach služieb mobilných operátorov v ...

Žiadne komentáre

Vyhľadávanie

ITSMF jar

Najnovšie videá