Жесты в Android

Gestures Builder

Gestures Builder

Сегодняшний пост про использование жестов в Android. Начиная с версии API 1.6, появилась возможность подключать библиотеку android.gesture. Сегодня мы опять пишем приложение для Android.

Условно нашу работу по созданию приложения, иллюстрирующего работу с жестами в Android можно разделить на две логические части:

  1. Подготовительная часть. В ней мы создаём файл с записанными жестами на эмуляторе и переносим его в каталог с приложением.
  2. Основная часть. К ней относится собственно программирование.

Итак, приступим к первой части. Вам нужно сконфигурировать эмулятор таким образом, чтобы в нём присутствовал внешний накопитель. Вот так это выглядит у меня:

Эмулятор Android с SD-картой

Эмулятор Android с SD-картой

Запускаем эмулятор и в нём приложение Gestures Builder:

Gestures Builder

Gestures Builder

Добавляем новый жест:

Gestures Builder

Gestures Builder

Вот мой жест:

Gestures Builder

Gestures Builder

После завершения всех манипуляций на SD-карте должен появится файл gestures:

gestures file

Файл с заданными жестами

Сохраняем его куда-нибудь к себе на компьютер.

Пришло время для второй части – программирования.

Текст программы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package gesturesample.com.com;
 
import java.util.ArrayList;
 
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.os.Bundle;
import android.widget.TextView;
 
public class GestureSampleActivity extends Activity implements OnGesturePerformedListener {
    private GestureLibrary gestureLib;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.main);
 
        //указываем где лежат ресурсы с жестами
        gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
 
        //если загрузка не удалась завершаем приложение
        if (!gestureLib.load()) {
            finish();
        }
 
        //добавим обработчик жестов к текущему Activity
        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);
 
    }
    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
        //распознаём жест
        ArrayList predictions = gestureLib.recognize(gesture);
        //определяем какие действия проводить 
        //в ответ на определённый жест
 
        if (predictions.size()>0) {
            Prediction prediction = predictions.get(0);
            if (prediction.score>1.0) {
                if (prediction.name.equals("ShowText")) {
                    TextView t = (TextView) findViewById(R.id.hello);
                    t.setText("Поздравляю. Жесты работают!");
                }
            }
        }
    }
 
}
package gesturesample.com.com;

import java.util.ArrayList;

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.os.Bundle;
import android.widget.TextView;

public class GestureSampleActivity extends Activity implements OnGesturePerformedListener {
	private GestureLibrary gestureLib;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //указываем где лежат ресурсы с жестами
        gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

        //если загрузка не удалась завершаем приложение
        if (!gestureLib.load()) {
        	finish();
        }

        //добавим обработчик жестов к текущему Activity
        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);

    }
	@Override
	public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
		//распознаём жест
		ArrayList predictions = gestureLib.recognize(gesture);
		//определяем какие действия проводить 
		//в ответ на определённый жест

		if (predictions.size()>0) {
			Prediction prediction = predictions.get(0);
			if (prediction.score>1.0) {
				if (prediction.name.equals("ShowText")) {
					TextView t = (TextView) findViewById(R.id.hello);
					t.setText("Поздравляю. Жесты работают!");
				}
			}
		}
	}

}

Текст изменённого файла main.xml:

1
<!--?xml version="1.0" encoding="utf-8"?-->
<!--?xml version="1.0" encoding="utf-8"?-->

Пояснений давать не буду и так всё понятно из записей в листинге программы, только прошу обратить внимание на то, какие изменения произошли в файле main.xml. В нём мы явно указали область действия (набор компонентов), на которые распространяются правила обработки жестов.

Если всё-таки вопросы возникнут, то можете задавать их в комментариях – постараюсь ответить.
Советую также обратить внимание на coding4.net — коллективный блог о программировании под .Net Framework.

У меня получилось в итоге вот такая вещь:

gestures result

Результат работы программы GesturesSample

Напоследок, как обычно, исходники: Gestures Sample

Bookmark the permalink.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *