Dotykové ovládání v Androidu

Podobně jako iOS Android vytvoří objekt, který obsahuje data o fyzické interakci uživatele s obrazovkou Android.View.MotionEvent – objekt. Tento objekt obsahuje data, jako je například akce, kde došlo k dotyku, kolik tlaku bylo použito atd. Objekt MotionEvent rozdělí pohyb na následující hodnoty:

  • Kód akce, který popisuje typ pohybu, například počáteční dotykové ovládání, pohyb přes obrazovku nebo konec dotykového ovládání.

  • Sada hodnot osy, které popisují polohu MotionEvent a další vlastnosti pohybu, jako je místo, kde probíhá dotyk, kdy došlo k dotyku a kolik tlaku bylo použito. Hodnoty osy se můžou lišit v závislosti na zařízení, takže předchozí seznam nepopisuje všechny hodnoty osy.

Objekt MotionEvent se předá příslušné metodě v aplikaci. Existují tři způsoby, jak aplikace Xamarin.Android reagovat na dotykovou událost:

  • Přiřadit obslužnou rutinu View.Touch události – Android.Views.View třída má EventHandler<View.TouchEventArgs> , ke které aplikace mohou přiřadit obslužnou rutinu. Toto je typické chování .NET.

  • Implementace View.IOnTouchListener – Instance tohoto rozhraní mohou být přiřazeny k objektu zobrazení pomocí Zobrazení. SetOnListener Metoda. Toto je funkčně ekvivalentní přiřazení obslužné rutiny události k View.Touch události. Pokud existuje nějaká běžná nebo sdílená logika, kterou může při dotyku potřebovat mnoho různých zobrazení, bude efektivnější vytvořit třídu a implementovat tuto metodu, než přiřadit každému zobrazení vlastní obslužnou rutinu události.

  • Přepsání View.OnTouchEvent – Všechna zobrazení v podtřídě Android.Views.ViewAndroidu . Když se dotkne zobrazení, Android zavolá OnTouchEvent objekt a předá ho MotionEvent jako parametr.

Poznámka:

Ne všechna zařízení s Androidem podporují dotykové obrazovky.

Přidání následující značky do souboru manifestu způsobí, že Google Play zobrazí aplikaci jenom na zařízeních s povoleným dotykem:

<uses-configuration android:reqTouchScreen="finger" />

Gesta

Gesto je ručně nakreslený obrazec na dotykové obrazovce. Gesto může mít jeden nebo více tahů, přičemž každý tah se skládá z posloupnosti bodů vytvořených jiným bodem kontaktu s obrazovkou. Android může podporovat mnoho různých typů gest, od jednoduchého blikání přes obrazovku až po složitá gesta, která zahrnují vícedotykové ovládání.

Android poskytuje Android.Gestures obor názvů speciálně pro správu gest a reagování na ně. Jádrem všech gest je zvláštní třída s názvem Android.Gestures.GestureDetector. Jak název napovídá, tato třída bude naslouchat gestům a událostem na MotionEvents základě dodaného operačního systému.

K implementaci detektoru gest musí aktivita vytvořit instanci GestureDetector třídy a poskytnout instanci IOnGestureListener, jak je znázorněno v následujícím fragmentu kódu:

GestureOverlayView.IOnGestureListener myListener = new MyGestureListener();
_gestureDetector = new GestureDetector(this, myListener);

Aktivita musí také implementovat OnTouchEvent a předat MotionEvent detektoru gest. Následující fragment kódu ukazuje příklad:

public override bool OnTouchEvent(MotionEvent e)
{
    // This method is in an Activity
    return _gestureDetector.OnTouchEvent(e);
}

Když instance GestureDetector identifikuje gesto zájmu, upozorní aktivitu nebo aplikaci buď vyvoláním události, nebo prostřednictvím zpětného volání poskytnutého GestureDetector.IOnGestureListener. Toto rozhraní poskytuje šest metod pro různá gesta:

  • OnDown – Volá se, když dojde k klepnutí, ale není vydáno.

  • OnFling – Volá se při blikání a poskytuje data na začátku a koncovém dotyku, která aktivovala událost.

  • OnLongPress - Volá se, když dojde k dlouhému stisknutí.

  • OnScroll – Volá se, když dojde k události posouvání.

  • OnShowPress – Volá se po tom, co došlo k OnDownu a nebyla provedena událost přesunutí nebo nahoru.

  • OnSingleTapUp – Volá se, když dojde k jednomu klepnutí.

V mnoha případech můžou aplikace zajímat jenom podmnožinu gest. V tomto případě by aplikace měly rozšířit třídu GestureDetector.SimpleOnGestureListener a přepsat metody, které odpovídají událostem, které mají zájem.

Vlastní gesta

Gesta představují skvělý způsob, jak uživatelé pracovat s aplikací. Rozhraní API, která jsme zatím viděli, by stačila pro jednoduchá gesta, ale pro složitější gesta by mohla být trochu komplikovanější. Pro usnadnění složitějších gest poskytuje Android další sadu rozhraní API v oboru názvů Android.Gestures, která usnadní určitou zátěž spojenou s vlastními gesty.

Vytváření vlastních gest

Vzhledem k tomu, že Android 1.6, sada Android SDK je součástí předinstalované aplikace v emulátoru s názvem Gestas Builder. Tato aplikace umožňuje vývojáři vytvářet předem definovaná gesta, která lze vložit do aplikace. Následující snímek obrazovky ukazuje příklad Tvůrce gest:

Screenshot of Gestures Builder with example gestures

Vylepšená verze této aplikace s názvem Gesto Tool lze najít Google Play. Nástroj gesta je velmi podobný Tvůrci gest s tím rozdílem, že vám umožňuje otestovat gesta po jejich vytvoření. Následující snímek obrazovky ukazuje Tvůrce gest:

Screenshot of Gesture Tool with example gestures

Nástroj gest je trochu užitečnější pro vytváření vlastních gest, protože umožňuje testování gest při jejich vytváření a je snadno dostupný prostřednictvím Google Play.

Nástroj gesta umožňuje vytvořit gesto kreslením na obrazovku a přiřazením názvu. Po vytvoření gest se uloží do binárního souboru na kartě SD vašeho zařízení. Tento soubor je potřeba načíst ze zařízení a pak ho zabalit pomocí aplikace ve složce /Resources/raw. Tento soubor lze načíst z emulátoru pomocí mostu pro ladění androidu. Následující příklad ukazuje zkopírování souboru z Galaxy Nexus do adresáře Resource aplikace:

$ adb pull /storage/sdcard0/gestures <projectdirectory>/Resources/raw

Jakmile soubor načtete, musí být zabalený do vaší aplikace v adresáři /Resources/raw. Nejjednodušší způsob, jak tento soubor gest použít, je načíst soubor do gestaLibrary, jak je znázorněno v následujícím fragmentu kódu:

GestureLibrary myGestures = GestureLibraries.FromRawResources(this, Resource.Raw.gestures);
if (!myGestures.Load())
{
    // The library didn't load, so close the activity.
    Finish();
}

Používání vlastních gest

Aby bylo možné rozpoznat vlastní gesta v aktivitě, musí mít objekt Android.Gesture.GestureOverlay přidaný do jejího rozložení. Následující fragment kódu ukazuje, jak programově přidat GestOverlayView do aktivity:

GestureOverlayView gestureOverlayView = new GestureOverlayView(this);
gestureOverlayView.AddOnGesturePerformedListener(this);
SetContentView(gestureOverlayView);

Následující fragment kódu XML ukazuje, jak přidat GestOverlayView deklarativním způsobem:

<android.gesture.GestureOverlayView
    android:id="@+id/gestures"
    android:layout_width="match_parent "
    android:layout_height="match_parent" />

Obsahuje GestureOverlayView několik událostí, které budou vyvolány během procesu kreslení gesta. Nejzajímavější událostí je GesturePerformed. Tato událost se vyvolá, když uživatel dokončí kreslení gesta.

Při vyvolání této události se aktivita zeptá GestureLibrary , jestli se má uživatel pokusit a shodovat s jedním z gest vytvořených nástrojem Gesta. GestureLibrary vrátí seznam objektů predikce.

Každý objekt předpovědi obsahuje skóre a název jednoho z gest v objektu GestureLibrary. Čím vyšší je skóre, tím pravděpodobnější je, že gesto pojmenované v predikci odpovídá gestu, které uživatel nakreslil. Obecně řečeno, skóre nižší než 1,0 jsou považovány za špatné shody.

Následující kód ukazuje příklad párování gesta:

private void GestureOverlayViewOnGesturePerformed(object sender, GestureOverlayView.GesturePerformedEventArgs gesturePerformedEventArgs)
{
    // In this example _gestureLibrary was instantiated in OnCreate
    IEnumerable<Prediction> predictions = from p in _gestureLibrary.Recognize(gesturePerformedEventArgs.Gesture)
    orderby p.Score descending
    where p.Score > 1.0
    select p;
    Prediction prediction = predictions.FirstOrDefault();

    if (prediction == null)
    {
        Log.Debug(GetType().FullName, "Nothing matched the user's gesture.");
        return;
    }

    Toast.MakeText(this, prediction.Name, ToastLength.Short).Show();
}

Díky tomu byste měli vědět, jak používat dotykové ovládání a gesta v aplikaci Xamarin.Android. Pojďme se teď podívat na názorný postup a podívat se na všechny koncepty v funkční ukázkové aplikaci.