Сенсорные технологии в Android

Как и в iOS, Android создает объект, содержащий данные о физическом взаимодействии пользователя с экраном — Android.View.MotionEvent объектом. Этот объект содержит такие данные, как то, что выполняется действие, где произошло касание, сколько давления было применено и т. д. MotionEvent Объект разбивает движение на следующие значения:

  • Код действия, описывающий тип движения, например начальное касание, сенсорное перемещение по экрану или конец сенсорного ввода.

  • Набор значений осей, описывающих положение MotionEvent и других свойств перемещения, таких как место, где происходит касание, когда произошло касание, и сколько давления использовалось. Значения осей могут отличаться в зависимости от устройства, поэтому предыдущий список не описывает все значения осей.

Объект MotionEvent передается соответствующему методу в приложении. Существует три способа реагирования приложения Xamarin.Android на событие сенсорного ввода:

  • Назначение обработчику View.Touch событий — Android.Views.View класс имеет приложение EventHandler<View.TouchEventArgs> , которому можно назначить обработчик. Это типичное поведение .NET.

  • Реализация View.IOnTouchListener . Экземпляры этого интерфейса могут быть назначены объекту представления с помощью представления. SetOnListener Метод. Это функционально эквивалентно назначению обработчика событий событию View.Touch . Если существует некоторая распространенная или общая логика, которая может потребоваться при касании различных представлений, будет более эффективно создать класс и реализовать этот метод, чем назначить каждое представление собственным обработчиком событий.

  • Переопределение — все представления в подклассе View.OnTouchEventAndroid.Views.ViewAndroid. При касании представления Android вызовет OnTouchEvent его и передает объект MotionEvent в качестве параметра.

Примечание.

Не все устройства Android поддерживают сенсорные экраны.

Добавление следующего тега в файл манифеста приводит к тому, что Google Play отображает приложение только на тех устройствах, которые включены сенсорного ввода:

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

Жесты

Жест — это нарисованная руками фигура на сенсорном экране. Жест может иметь один или несколько штрихов к нему, каждый штрих, состоящий из последовательности точек, созданных другой точкой контакта с экраном. Android может поддерживать множество различных типов жестов, от простого флаинга по экрану до сложных жестов, которые включают много касание.

Android предоставляет Android.Gestures пространство имен специально для управления жестами и реагирования на них. В основе всех жестов называется специальный класс Android.Gestures.GestureDetector. Как подразумевает имя, этот класс будет прослушивать жесты и события на MotionEvents основе предоставленной операционной системой.

Чтобы реализовать детектор жестов, действие должно создать GestureDetector экземпляр класса и предоставить экземпляр IOnGestureListener, как показано в следующем фрагменте кода:

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

Действие также должно реализовать OnTouchEvent и передать MotionEvent детектору жестов. В следующем фрагменте кода показан пример:

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

Если экземпляр GestureDetector идентифицирует интересующий жест, он уведомляет действие или приложение, вызывая событие или через обратный вызов, GestureDetector.IOnGestureListenerпредоставляемый. Этот интерфейс предоставляет шесть методов для различных жестов:

  • OnDown — вызывается при возникновении касания, но не освобождается.

  • OnFling — вызывается при выполнении fling и предоставляет данные на начальном и конце сенсорного ввода, активировав событие.

  • OnLongPress — вызывается при длительном нажатии.

  • OnScroll — вызывается при возникновении события прокрутки.

  • OnShowPress — вызывается после того, как произошло событие OnDown, и событие перемещения или вверх не было выполнено.

  • OnSingleTapUp — вызывается при возникновении одного касания.

Во многих случаях приложения могут быть заинтересованы только в подмножестве жестов. В этом случае приложения должны расширить класс GestureDetector.SimpleOnGestureListener и переопределить методы, соответствующие интересующим событиям.

Пользовательские жесты

Жесты — отличный способ взаимодействия пользователей с приложением. ИНТЕРФЕЙСы API, которые мы видели до сих пор, было бы достаточно для простых жестов, но может оказаться немного осложненным для более сложных жестов. Чтобы помочь с более сложными жестами, Android предоставляет другой набор API в пространстве имен Android.Gestures, который упрощает некоторые нагрузки, связанные с пользовательскими жестами.

Создание пользовательских жестов

Так как Android 1.6 пакет SDK для Android поставляется с предварительно установленным приложением в эмуляторе с именем "Построитель жестов". Это приложение позволяет разработчику создавать предварительно определенные жесты, которые могут быть внедрены в приложение. На следующем снимке экрана показан пример построителя жестов:

Screenshot of Gestures Builder with example gestures

Улучшенная версия этого приложения, называемого инструментом жестов, можно найти Google Play. Инструмент жестов очень похож на построитель жестов, за исключением того, что он позволяет тестировать жесты после их создания. На следующем снимках экрана показан построитель жестов:

Screenshot of Gesture Tool with example gestures

Инструмент жестов немного удобнее для создания пользовательских жестов, так как он позволяет тестировать жесты по мере их создания и легко доступен через Google Play.

Средство жестов позволяет создать жест, нарисовав на экране и назначив имя. После создания жестов они сохраняются в двоичном файле на SD-карта устройства. Этот файл необходимо извлечь с устройства, а затем упаковать с помощью приложения в папке /Resources/raw. Этот файл можно получить из эмулятора с помощью моста отладки Android. В следующем примере показано копирование файла из Galaxy Nexus в каталог ресурсов приложения:

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

После получения файла его необходимо упаковить с приложением в каталоге /Resources/raw. Самый простой способ использовать этот файл жеста — загрузить файл в ЖестЛибрари, как показано в следующем фрагменте кода:

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

Использование пользовательских жестов

Чтобы распознать пользовательские жесты в действии, он должен иметь объект Android.GestureOverlay, добавленный в его макет. В следующем фрагменте кода показано, как программным способом добавить Объект GestureOverlayView в действие:

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

В следующем фрагменте XML показано, как добавить объект GestureOverlayView декларативно:

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

Имеет GestureOverlayView несколько событий, которые будут возникать во время процесса рисования жеста. Самое интересное событие .GesturePerformed Это событие возникает, когда пользователь завершил рисование жеста.

При возникновении этого события действие запрашивает GestureLibrary попробовать и сопоставить жест, который пользователь с одним из жестов, созданных средством жестов. GestureLibrary возвращает список объектов прогнозирования.

Каждый объект прогнозирования содержит оценку и имя одного из жестов в объекте GestureLibrary. Чем выше оценка, тем более вероятно, что жест, названный в прогнозе, соответствует жесту, нарисованном пользователем. Как правило, оценки ниже 1,0 считаются плохими матчами.

В следующем коде показан пример сопоставления жеста:

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();
}

Для этого необходимо понять, как использовать сенсорные и жесты в приложении Xamarin.Android. Давайте перейдем к пошаговому руководству и рассмотрим все основные понятия в рабочем примере приложения.