Современные телефоны предоставляют программистам поистине удивительные возможность. Судите сами, сегодня дисплей для смартфона - не только средство отображения информации, но и мощный интерфейс для взаимодействия с пользователем. Современные дисплеи могут фиксировать множество прикосновений, распознавать жесты и даже определять силу нажатия (3D Touch). Тем удивительнее, что все это богатство довольно редко используется программистами при разработке новых игр и мобильных приложений. Эта статья поможет исправить это досадное недоразумение. Сегодня речь пойдет о распознавании жестов.
В Android для поддержки жестов используется специальный вид: "GestureOverlayView". Жесты как таковые представляют собой двоичные ресурсы. Их можно создать с помощью Android SDK. В свою activity жесты можно загрузить с помощью метода GestureLib.fromRawResource(). Если система распознает жест, вызывается метод onGesturePerformedListener(). Соответственно у activity должен быть объявлена поддержка интерфейса GestureOverlayView, кроме того, Activity должна зарегистрировать себя в GestureOverlayView с помощью метода addOnGesturePerformedListener().
Распознанные жестов в Android отображаются желтым цветом - а нераспознанные - бледно-желтым. Эту подсветку можно отключить через методы setGestureColor(Color.TRANSPARENT) и setUncertainGestureColor(Color.TRANSPARENT) для GestureOverlayView.
Создать новые жесты можно через Android эмулятор, запустив на нем программу GestureBuilder. Вы можете создать несколько жестов с одинаковыми именами. Это поможет более точно распознавать их. При создании эмулятора добавьте поддержку sdcard, в противном случае вы просто не сможете сохранить жесты. Все жесты сохраняются в файл gestures на эмуляторе. Скачать этот файл с эмулятора можно с помощью adb, выполнив команду:
./adb pull /sdcard/gestures ~/test
После ее выполнения файл с жестами будет сохранен в папку "res/raw" и их можно будет использовать в GestureOverlayView.
Если Вам не хочется возиться с эмулятором, можете установить на свой телефон программу "Gesture Builder" из Google Play. У нее очень простой интерфейс. В режиме Add вы водите пальцем по дисплею смартфона, рисуя нужный жест. После этого вы вводите его название, и жест сохраняется на карточку. При сохранении жеста отображается путь до файла gesture.txt. После добавления всех необходимых жестов этот файл нужно скопировать в свой проект.
Давайте разработаем небольшое тестовое приложение, реализующее распознавание жестов. Создайте новый проект. Главную Activity назовите "GestureTest". Создадим layout main.xml.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello"/> </LinearLayout>
Код главной activity приведен ниже. Обратите внимание, мы добавляем GestureOverlayView программно в методе onCreate. Там же мы привязали GesturePerformedListener для обработки жестов. Как видите, в onGesturePerformed мы создаем список predictions, содержащий наши жесты и параметр scope, который отражает степень соответствия введенного жеста жнсту библиотеки. В цикле for мы проходимся по этому списку, и если оказывается, что scope больше единицы, считаем жест распознанным, и через Toast печатаем сообщение на экране.
import java.util.ArrayList; import android.app.Activity; import android.gesture.Prediction; import android.os.Bundle; import android.view.View; import android.widget.Toast; import android.gesture.Gesture; import android.gesture.GestureLibraries; import android.gesture.GestureLibrary; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGesturePerformedListener; public class GestureTest extends Activity implements OnGesturePerformedListener { private GestureLibrary gestureLib; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GestureOverlayView gestureOverlayView = new GestureOverlayView(this); View inflate = getLayoutInflater().inflate(R.layout.main, null); gestureOverlayView.addView(inflate); gestureOverlayView.addOnGesturePerformedListener(this); gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures); if (!gestureLib.load()) { finish(); } setContentView(gestureOverlayView); } @Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { ArrayList<Prediction> predictions = gestureLib.recognize(gesture); for (Prediction prediction : predictions) { if (prediction.score > 1.0) { Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT) .show(); } } } }
Можете запустить приложение и поводить пальцем по дисплею своего смартфона, поиграться с различными жестами.
Оригинал: Lars Vogel Android Gestures - Tutorial.