それでは、実際にソースコードを見ながらジェスチャー機能を確認していきましょう。
このサンプルアプリは、初回に入力されたジェスチャーを保存し、以降は入力されたジェスチャーを初回のジェスチャーと比較して“スコア”(得点)を表示します。
最初に数字の「2」というジェスチャーをしてみます。
これを保存して、同じように「2」をジェスチャーさせてみます。
すると、前回のジェスチャーと比較して、スコアを表示します。
このスコアが1.0以上であれば似ている、と判断できるようです。ただし、全然似ていなくても1.0を超えることはよくありますので、このスコア判定の調整は最終的に設定項目を設けてエンドユーザーに設定してもらうのがよいような気がします。
試しに、似ていないジェスチャーを入力してみましょう。
このジェスチャーのスコアは、以下のとおり1.0未満です。
ここからは、コードを見ながら解説していきます。
まずは、レイアウトXMLです。
<?xml version="1.0" encoding="utf-8"?>
<android.gesture.GestureOverlayView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/GestureOverlayView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gestureStrokeType="multiple">
<ListView
android:id="@+id/ListView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</android.gesture.GestureOverlayView>
GestureOverlayViewは、レイアウトやビューなどほかの機能とは異なり、フルパスで記載しなければなりません。また、GestureOverlayViewはFrameLayoutを継承しているので、レイアウトやビューを入れ子で格納可能です。
属性で大事なのはandroid:gestureStrokeTypeで、これはジェスチャーをシングルストロークにするかマルチストロークにするかを選択するものです。
| 定義 | 意味 |
|---|---|
| single | シングルストローク |
| multiple | マルチストローク |
| 表5 ストロークの種類 | |
マルチストロークだと、以下のようなジェスチャーも可能で、かつ、これぐらい複雑なジェスチャーだと、スコアもかなり高くなります。
ジェスチャーを使用するためには、GestureLibraryを作成して、そこにGestureを登録したり読み出したりしなければなりません。GestureLibraryの作成方法は、大きく3つあります。
今回は、プライベートファイルを使用しています。
final GestureLibrary gl = GestureLibraries.fromPrivateFile(this, "gestures");
上記で「/data/data/com.example.android.gesture/files/gestures」というファイルが作成されます。
サンプルコードは、後は動作確認用のリスナーを追加しているだけですが、その中でも最も重要なコールバックメソッドの中身を説明します。
@Override
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
Log.v("Gesture", "onGesturePerformed");
Log.v("Gesture", "\tid:" + gesture.getID());
Log.v("Gesture", "\tlength:" + gesture.getLength());
Log.v("Gesture", "\tdescribeContents:" + gesture.describeContents());
if (gl.getGestureEntries().size() == 0) {
gl.addGesture("First", gesture);
gl.save();
} else {
ArrayList predictions = gl.recognize(gesture);
Log.v("Gesture", "\tpredictions.size:" + predictions.size());
for (Prediction p : predictions) {
Log.v("Gesture", "\tPrediction name:" + p.name + " score:" + p.score);
Toast.makeText(Main.this, "score:" + p.score, Toast.LENGTH_SHORT).show();
}
}
}
onGesturePerformedメソッドは、ジェスチャー入力後、入力したジェスチャーが渡されてくる唯一のメソッドです。処理としては、GestureLibraryが空なら追加し、空ではないならGestureLibrary#recognize(Gesture)メソッドでPredictionのリストを取得しています。取得したPredictionから名前とスコアが取り出せるので、それに応じてアプリ固有のビジネスロジックを実行します。
次ページでは、ジェスチャーを作成する「Gesture Builder」アプリとテキスト読み上げのTextToSpeechd機能を解説します。
Copyright © ITmedia, Inc. All Rights Reserved.