Dotykové ovládání v Androidu

Podobně jako u iOS se v Androidu vytvoří objekt, který uchovává data o fyzické interakci uživatele s obrazovkou – Android.View.MotionEvent objekt. Tento objekt obsahuje data, jako je například akce prováděná, kde došlo k dotyku, jaký tlak byl použit atd. MotionEvent Objekt rozdělí přesun do následujících hodnot:

  • Kód akce, který popisuje typ pohybu, jako je například počáteční dotyk, dotykové přesunutí na obrazovce nebo ukončení dotykového ovládání.

  • Sada hodnot osy, která popisuje umístění MotionEvent a další vlastnosti pohybu, například místo, kde se dotyk koná, kdy došlo k dotyku a jaký tlak byl použit. Hodnoty osy se můžou lišit v závislosti na zařízení, takže předchozí seznam nepopisuje všechny hodnoty osy.

MotionEventObjekt bude předán příslušné metodě v aplikaci. Existují tři způsoby, jak může aplikace Xamarin. Android reagovat na událost dotykového ovládání:

  • Přiřazení obslužné rutiny události - Android.Views.View Třída obsahuje, EventHandler<View.TouchEventArgs> které aplikace mohou přiřadit obslužnou rutinu. Toto je typické chování rozhraní .NET.

  • Implementace -Instance tohoto rozhraní mohou být přiřazeny objektu zobrazení pomocí zobrazení. SetOnListener Metoda. To je funkčně ekvivalentní k přiřazení obslužné rutiny události View.Touch . Pokud je k dispozici nějaká společná nebo sdílená logika, která může vyžadovat mnoho různých zobrazení při dotyku, bude efektivnější vytvořit třídu a implementovat tuto metodu, než každému zobrazení přiřadíte vlastní obslužnou rutinu události.

  • Přepsat -Všechna zobrazení v podtřídě Androidu Android.Views.View . Když je zobrazení retušované, Android zavolá OnTouchEvent a předá MotionEvent objekt 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 ta zařízení, která jsou zapnutá dotykem:

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

Gesta

Gesto je na dotykové obrazovce rukou nakresleným tvarem. Gesto může mít jeden nebo více tahů, každý tah tvořený sekvencí bodů vytvořenými jiným bodem kontaktu s obrazovkou. Android může podporovat mnoho různých typů gest, od jednoduchých Fling po celou obrazovku až po složitá gesta, která zahrnují více dotykové ovládání.

Android poskytuje Android.Gestures obor názvů speciálně pro správu a reagování na gesta. Na srdci všech gest je speciální třída s názvem Android.Gestures.GestureDetector . Jak název naznačuje, tato třída bude naslouchat gestům a událostem, které MotionEvents jsou založeny na operačním systému.

Pro implementaci detektoru gesta 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 rozhraní OnTouchEvent a předat MotionEvent detektoru gesta. Následující fragment kódu ukazuje příklad této:

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í, které poskytuje GestureDetector.IOnGestureListener . Toto rozhraní poskytuje šest metod pro různá gesta:

  • On- Down – volá se, když dojde k klepnutí, ale není vydané.

  • OnFling – volá se, když dojde k Fling a poskytuje data na začátku a na konci dotykového ovládání, které spustilo událost.

  • OnLongPress – volá se, když dojde k dlouhému stisknutí.

  • Scroll – volá se, když dojde k události Scroll.

  • OnShowPress – voláno po chybě a událost přesunutí nebo nahoru nebyla provedena.

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

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

Vlastní gesta

Gesta jsou skvělým způsobem, jak uživatelé interaktivně pracovat s aplikací. Rozhraní API, která jsme zatím viděli, by mohla stačit pro jednoduchá gesta, ale můžou se u složitějších gest prokázat trochu náročné. Pro usnadnění složitějších gest nabízí Android další sadu rozhraní API v oboru názvů Android. gesta, která usnadňují část režie související s vlastními gesty.

Vytváření vlastních gest

Od verze Android 1,6 se Android SDK dodává s aplikací předinstalovanou na emulátoru s názvem tvůrce gest. Tato aplikace umožňuje vývojářům vytvářet předem definovaná gesta, která je možné vložit do aplikace. Následující snímek obrazovky ukazuje příklad tvůrce gest:

Snímek obrazovky tvůrce gest s příklady gest

Vylepšená verze této aplikace s názvem nástroj gesta se dá najít Google Play. Nástroj gesta je velmi podobný tvůrci gest, s tím rozdílem, že umožňuje testovat gesta po jejich vytvoření. Tento další snímek obrazovky ukazuje tvůrce gest:

Snímek obrazovky s nástrojem gesta s příklady gest

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

Nástroj gesto umožňuje vytvořit gesto vykreslením na obrazovce a přiřazením názvu. Po vytvoření gest jsou uložená v binárním souboru na kartě SD vašeho zařízení. Tento soubor se musí načíst ze zařízení a pak se do něj zabalit pomocí aplikace ve složce/Resources/RAW.. Tento soubor lze načíst z emulátoru pomocí Android Debug Bridge. Následující příklad ukazuje kopírování souboru z Nexus Galaxy do adresáře prostředků aplikace:

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

Jakmile načtete soubor, musí být zabalen s vaší aplikací v adresáři/Resources/RAW. Nejjednodušší způsob, jak použít tento soubor gesta, je načíst soubor do GestureLibrary, 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žití vlastních gest

Chcete-li rozpoznat vlastní gesta v aktivitě, musí mít objekt Android. gesto. GestureOverlay přidaný do jeho rozložení. Následující fragment kódu ukazuje, jak programově přidat GestureOverlayView do aktivity:

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

Následující fragment kódu XML ukazuje, jak deklarativně přidat GestureOverlayView:

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

GestureOverlayViewMá několik událostí, které budou vyvolány během procesu nakreslení gesta. Nejzajímavější událost je GesturePerformed . Tato událost se vyvolá, když uživatel dokončil vykreslování svého gesta.

Když se tato událost vyvolá, aktivita se zeptá a požádá o GestureLibrary gesto, které uživatel s jedním z gest vytvořených nástrojem gesta vytvořil. GestureLibrary Vrátí seznam prediktivních objektů.

Každý objekt předpovědi obsahuje skóre a název jednoho z gest v GestureLibrary . Čím vyšší je skóre, tím pravděpodobnější je, že gesto s názvem v předpovědi odpovídá gestu vypracovanému uživatelem. Obecně řečeno, skóre nižší než 1,0 se považují za špatné shody.

Následující kód ukazuje příklad porovná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();
}

V takovém případě byste měli vědět, jak používat dotykové ovládání v aplikaci Xamarin. Android. Teď si můžeme přejít na Názorný postup a podívat se na všechny koncepty v pracovní ukázkové aplikaci.