осн прог. Цель лабораторной работы Установка и настройка среды программирования adt bundle Задачи лабораторной работы
Скачать 3.46 Mb.
|
10.3 Распознавание только части поддерживаемых жестов Разработаем приложение, в котором продемонстрируем распознавание только некоторой части поддерживаемых жестов по выбору программиста. Мы рассмотрим распознавание жеста смахивания (fling). Приложение содержит одну активность, одно информационное поле для вывода информации о распознанном жесте. Приложение работает следующим образом: пользователь выполняет один из поддерживаемых сенсорных жестов, в информационном поле отображается информация о распознанном жесте. 1. Создадим простое приложение и добавим на форму TextView для вывода информации. 2. Настроим логику приложения. В java класс, соответствующий активности внесем следующие дополнения. Нам понадобится экземпляр класса GestureDetectorCompat поэтому в качестве поля класса активности объявим следующую переменную: GestureDetectorCompat mDetector; В методе onCreate() класса активности, создадим экземпляр класса GestureDetectorCompat и присвоим его переменной mDetector: mDetector=new GestureDetectorCompat(this, new MyGestListener()); в конструкторе аргументом, отвечающим за отслеживание сенсорных событий, служит экземпляр класса MyGestListener() - внутренний класс, который является наследником класса GestureDetector.SimpleOnGestureListener. Имеет смысл немного рассмотреть класс GestureDetector.SimpleOnGestureListener. Этот класс реализует интерфейсы GestureDetector.OnGestureListener и GestureDetector.OnDoubleTapListener, все методы заявленные в интерфейсах в этом классе имеют пустую реализацию и те, которые должны возвращать значение, возвращают false. Поэтому для распознавания какого-то события или некоторого подмножества событий достаточно написать реализацию соответствующих методов, в классе наследнике. В листинге 10.2 представлен код приложения, в котором распознается только жест смахивания, т. е. реализован метод onFling(), информация о появившемся и распознанном жесте выдается в информационное поле (TextView). В качестве слушателя используется экземпляр класса MyGest Listener(), являющийся наследником класса GestureDetector.SimpleOnGestureListener. Получить больше информации о распознавании жестов можно по ссылке: http://developer.android.com/training/gestures/index.html package com.example.lab5_1_gestall; import android.os.Bundle; import android.app.Activity; import android.support.v4.view.GestureDetectorCompat; import android.view.*; import android.widget.*; public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { TextView tvOutput; GestureDetectorCompat mDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvOutput = (TextView)findViewById(R.id.textView1); mDetector = new GestureDetectorCompat(this,this); mDetector.setOnDoubleTapListener(this); } public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); // Be sure to call the superclass implementation return super.onTouchEvent(event); } @Override public boolean onDown(MotionEvent event) { tvOutput.setText("onDown: " + event.toString()); return false; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { tvOutput.setText("onFling: " + event1.toString()+event2.toString()); return true; } @Override public void onLongPress(MotionEvent event) { tvOutput.setText("onLongPress: " + event.toString()); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { tvOutput.setText("onScroll: " + e1.toString()+e2.toString()); return true; } @Override public void onShowPress(MotionEvent event) { tvOutput.setText("onShowPress: " + event.toString()); } @Override public boolean onSingleTapUp(MotionEvent event) { tvOutput.setText("onSingleTapUp: " + event.toString()); return true; } @Override public boolean onDoubleTap(MotionEvent event) { tvOutput.setText("onDoubleTap: " + event.toString()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent event) { tvOutput.setText("onDoubleTapEvent: " + event.toString()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { tvOutput.setText("onSingleTapConfirmed: " + event.toString()); return true; } } Листинг 10.1. Распознавание поддерживаемых жестов с помощью реализации интерфейсов package com.example.lab5_1_gestsubset; import android.os.Bundle; import android.app.Activity; import android.support.v4.view.*; import android.view.*; import android.widget.*; public class SubsetGestActivity extends Activity { private GestureDetectorCompat mDetector; private TextView tvOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_subset_gest); mDetector = new GestureDetectorCompat(this, new MyGestListener()); tvOut = (TextView)findViewById(R.id.textView1); } @Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } class MyGestListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { tvOut.setText("onFling: " + event1.toString()+event2.toString()); return true; } } } Листинг 10.2. Распознавание жестов с использованием класса GestureDetector.SimpleOnGestureListener. Внимание! Если Вы увидите ошибку на нашем сайте, выделите её и нажмите Ctrl+Enter. © Национальный Открытый Университет "ИНТУИТ", 2016 | www.intuit.ru Самостоятельная работа 6. Принципы работы c жестами вводимыми пользователями Цель лабораторной работы: Разработка приложения, помогающего понять принципы работы c жестами вводимыми пользователями. Задачи лабораторной работы: • создать набор жестов • использовать созданные жесты в приложении 11.1 Введение Начиная с версии 1.6, Android предоставляет API для работы с жестами, который располагается в пакете android.gesture и позволяет сохранять, загружать, создавать и распознавать жесты. В данной работе рассмотрим процесс создания набора жестов, для создания жестов будем использовать приложение Gesture Builder, которое предустановлено на виртуальные устройства Android (AVD), начиная с версии 1.6. После этого разработаем приложение, в котором предполагается распознавание и использование созданных жестов. 11.2 Создание набора жестов Для начала создадим новое приложение. Далее запустим эмулятор и используем приложение Gesture Builder для создания жестов "1", "2" и "S". Жест всегда связан с именем, но имя не обязательно должно быть уникальным, в действительности, для повышения точности в распознавании жеста рекомендуется сохранять несколько жестов с одним и тем же именем. На рис. 11.1 можно увидеть приложение Gesture Builder в работе, чтобы добавить жест, необходимо нажать на кнопку Add gesture, в свободном пространстве изобразить жест (обычно он рисуется желтым цветом), в поле ввода задать имя жеста. Результат последовательного добавления жестов можно увидеть на рис. 11.2 Жесты сохраняются на SD карте эмулятора, чтобы использовать их в приложении необходимо импортировать файл жестов в проект. увеличить изображение Рис. 11.1. Создание жестов с помощью приложения Gesture Builder увеличить изображение Рис. 11.2. Набор жестов, созданных в приложении Gesture Builder Комментарий:Gesture Builder может сообщить, что ему некуда сохранять жесты, в этом случае необходимо запустить эмулятор с образом SD карты. Сначала образ нужно создать с помощью утилиты mksdcard (расположена в папке , где Следующим шагом будет создать и запустить эмулятор с образом gesture.img, для этого зайдем в папку nameEmulator - имя, которое присвоено эмулятору при создании. Интересная статья на эту тему по ссылке: http://habrahabr.ru/post/120016/ Каждый раз, когда мы создаем или редактируем жесты с помощью Gesture Builder, создается файл gestures на SD карте эмулятора. Необходимо импортировать этот файл в директорию res/raw/, созданного проекта, в котором планируем использовать жесты. увеличить изображение Рис. 11.3. Расположение файла gestures Самый простой способ импортировать жесты в проект заключается использовании вкладки File Explorer в компоновке (perspective) DDMS. (Если компоновки DDMS нет найти ее можно следующим образом: Window->Open Perspective->Other...->DDMS. Если вкладки File Explorer нет, можно добавить: Window-> Show View-> File Explorer). На вкладке File Explorer найти директорию sdcard/ (в нашем случае оказалась директория storage/sdcard/ , имеет смысл при создании жестов обратить внимание в какую директорию Gesture Builder их сохраняет). На рис. 11.3 показана вкладка File Explorer в компоновке DDMS. Чтобы скопировать файл жестов с эмулятора в проект, необходимо выбрать его и нажать кнопку "Pull a file from the device", выделенную на рис. 11.3 красным подобием окружности. Откроется диалог с предложением выбрать папку, в которую необходимо скопировать жесты, здесь надо найти папку проекта, в ней папку res/raw/ (если папки raw/ нет, ее необходимо создать) и нажать кнопку Сохранить. Теперь жесты есть в нашем проекте и их можно использовать. 11.3 Использование созданных жестов в приложении Для распознавания жестов необходимо добавить элемент GestureOverlayView в XML файл активности. И этот файл может выглядеть, например, как показано на рис. 11.4 : увеличить изображение Рис. 11.4. XML файл активности приложения, элемент GestureOverlayView обычный компонент интерфейса пользователя Можно добавить элемент GestureOverlayView поверх всех компонентов, как прозрачный слой, в этом случае XML файл активности может выглядеть так, как показано на рис. 11.5 увеличить изображение Рис. 11.5. XML файл активности приложения, элемент GestureOverlayView поверх всех компонентов интерфейса пользователя Далее необходимо обработать ввод жеста пользователя, сравнить с загруженными жестами, и либо определить жест, либо сообщить пользователю, что такого жеста нет. Теперь вся работа будет выполняться в java файле, описывающем главную (и единственную) активность приложения. Внесем в этот класс следующие дополнения: • Класс активности должен реализовывать интерфейс OnGesturePerformedListener, для этого в объявление класса добавим конструкцию: • implements OnGesturePerformedListener; • Нам понадобятся экземпляры классов GestureLibrary и GestureOverlayView, поэтому в качестве полей класса активности объявим следующие переменные: • GestureLibrary gLib; • GestureOverlayView gestures; • В методе onCreate() выполним следующие действия: • gLib = GestureLibraries.fromRawResource(this, R.raw.gestures); • if (!gLib.load()) { • finish(); • } В первой строке выполнена инициализация переменной gLib жестами, загруженными из файла gestures папки res/raw/. Оператор if выполняет проверку загружены ли жесты, если нет, выполняется выход из приложения. • Добавим в метод onCreate() еще две строчки: • gestures = (GestureOverlayView) findViewById(R.id.gestureOverlayView1); • gestures.addOnGesturePerformedListener(this); Для инициализации переменной gesture и подключения к ней слушателя событий появления жеста. • И наконец напишем реализацию метода OnGesturePerformed(), который и будет вызываться при появлении события, соответствующего какому-либо жесту. • public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { • //Создаёт ArrayList c загруженными из gestures жестами • ArrayList predictions = gLib.recognize(gesture); • if (predictions.size() > 0) { • //если загружен хотябы один жест из gestures • Prediction prediction = predictions.get(0); • if (prediction.score > 1.0) { • if (prediction.name.equals("one")) • tvOut.setText("1"); • else if (prediction.name.equals("stop")) • tvOut.setText("stop"); • else if (prediction.name.equals("two")) • tvOut.setText("2"); • }else{ • tvOut.setText("Жест неизвестен"); • } • } • } В приложении всего лишь распознаются жесты и в информационное поле выводится информация о том, что за жест был использован. В листинге 11.1 представлен возможный код приложения. 11.4 Заключение В качестве практического задания предлагаем реализовать жестами ввод чисел в приложении "Угадайка", разработанном в лабораторной работе второй темы. Создать жесты "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" для ввода цифр и жест "S" для остановки ввода числа. В приложение добавить распознавание этих жестов, преобразование их в число и сравнение полученного числа с загаданным. Еще варианты для самостоятельной работы: 1. разработать простой калькулятор с жестовым вводом чисел и операций; 2. разработать блокнотик для заметок с рукописным вводом текста. package com.example.lab5_2_gestures; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.gesture.Gesture; import android.gesture.GestureLibraries; import android.gesture.GestureLibrary; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGesturePerformedListener; import android.gesture.Prediction; import android.view.Menu; import android.widget.TextView; public class Gestures extends Activity implements OnGesturePerformedListener{ GestureLibrary gLib; GestureOverlayView gestures; TextView tvOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gestures); tvOut=(TextView)findViewById(R.id.textView1); //Загрузка жестов (gestures) из res/raw/gestures gLib = GestureLibraries.fromRawResource(this, R.raw.gestures); if (!gLib.load()) { //Если жесты не загружены, то выход из приложения finish(); } gestures = (GestureOverlayView) findViewById(R.id.gestureOverlayView1); gestures.addOnGesturePerformedListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.gestures, menu); return true; } public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { //Создаёт ArrayList c загруженными из gestures жестами ArrayList predictions = gLib.recognize(gesture); if (predictions.size() > 0) { //если загружен хотя бы один жест из gestures Prediction prediction = predictions.get(0); if (prediction.score > 1.0) { if (prediction.name.equals("one")) tvOut.setText("1"); else if (prediction.name.equals("stop")) tvOut.setText("stop"); else if (prediction.name.equals("two")) tvOut.setText("2"); }else{ tvOut.setText("Жест неизвестен"); } } } } Листинг 11.1. Распознавание жестов загруженных в файл res/raw/gestures Внимание! Если Вы увидите ошибку на нашем сайте, выделите её и нажмите Ctrl+Enter. © Национальный Открытый Университет "ИНТУИТ", 2016 | www.intuit.ru Самостоятельная работа 7. Многооконное приложение Цель лабораторной работы: Разработка многооконного приложения, предоставляющего возможности: воспроизведения аудио и видео файлов, создания и отображения фотоснимков. Задачи лабораторной работы: • настроить интерфейс и реализовать логику активности для работы с камерой; • настроить интерфейс и реализовать логику активности для воспроизведения аудио и видео; • настроить интерфейс и реализовать логику активности для просмотра изображений; • настроить интерфейс и реализовать логику главной активности приложения. 12.1 Введение Для достижения цели, поставленной в лабораторной работе, сформулируем требования к разрабатываемому приложению, назовем его "Media". Приложение предоставляет пользователю возможность выбора рода деятельности: • работа с камерой для создания снимков; • воспроизведение аудио и видео; • просмотр изображений. В приложении предполагается реализовать четыре активности: • главная активность, предназначена для выбора рода деятельности, содержит три кнопки, нажатие на каждую кнопку вызывает к жизни соответствующую активность; • активность для работы с камерой и создания снимков; • активность для воспроизведения аудио и видео; • активность для просмотра изображений. 12.2 Создание приложения Создадим новое приложение, активность, полученную при создании проекта, оставим с именем MainActivity, она будет главной активностью приложения. Добавим в приложение еще три активности: New->Other...->Android Activity. В нашем приложении созданные активности имеют следующие имена: CameraActivity для работы с камерой и создания снимков; MediaActivity для воспроизведения видео и аудио; GalleryActivity для просмотра изображений. Далее продолжим работу с этими активностями, настроим интерфейс и реализуем логику для каждой из них. Начнем с активностей, отвечающих за тот или иной вид деятельности, главную активность приведем в порядок в самом конце работы. 12.3 Настройка интерфейса и реализация логики активности для работы с камерой Настроим интерфейс активности для работы с камерой. Нам понадобится окно предварительного просмотра, добавим в окно активности элемент SurfaceView. А так же нам понадобится кнопка для выполнения снимков, добавим в окно активности элемент ImageButton. Далее предлагаем настроить интерфейс самостоятельно. В нашем случае активность выглядит так, как показано на рис. 12.1 увеличить изображение |