ジェスチャーに対応する(3)Gestureを認識する


前回、ジェスチャーに対応する(2)Gestureを読み込むではジェスチャーのロード、認識しやすさについて説明しました。下記Listの2の部分にあたります。

  1. ジェスチャーの作成
  2. 作成したジェスチャーを登録する
  3. ジェスチャーを入力する
  4. 登録されたジェスチャーから最も認識率の高いジェスチャーを選択する

今回はついに最終回、3番、4番:ジェスチャーを入力する、認識する部分について紹介します。

GestureOverlayView

ジェスチャーの入力には専用のGestureOverlayViewクラスが用意されています。レイアウトファイル等で追加することで、ジェスチャーの入力をSDK側で担当してくれます。ちょうど図の黄色い大きな文字「き」の入力を担当しているのがGestureOverlayViewです。特徴は以下の3点です。

  • オーバーレイできる
  • ジェスチャー動作の表示(黄色の線)
  • ジェスチャーに関する リスナーを登録できる

サンプルコードは続きからどうぞ!

main.xml

<android.gesture.GestureOverlayView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gestures"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    android:gestureStrokeType="multiple"
    android:eventsInterceptionEnabled="true"
    android:orientation="vertical">

android.gesture.GestureOverlayViewは要素としてgestureStrokeType、eventsInterceptionEnabled、orientationを持ちます。

GestureOverlayViewの要素

要素名 概要
android:gestureStrokeType 一筆書き(single or multiple)
android:eventsInterceptionEnabled イベントに割り込んで即座に認識を始める
android:orientation Viewの向きを指定


とくに重要なのがeventsInterceptionEnabledです。オーバーレイしたビューの下位層に、スクロール可能なListViewなどがある場合、”true”を設定しておくことで、ジェスチャーを入力しているのに下位層のListViewが反応して、スクロールしてしまう、という誤動作を防ぐことが出来ます。

android:orientationはちょっとだけ複雑です。
スクロール方向の識別子(下に対して、縦か横か)を指定でき、 android:orientation = “vertical”の場合は、図のようにリストは垂直にスクロールするので、ジェスチャーのストロークが縦成分のみの場合、ジェスチャとして認識されません(薄黄色)。ストロークに水平成分が入って初めて、ジェスチャとして認識されます(黄色)

eventsInterceptionEnabledは、”single”つまり、一筆書きできるかんたんなジェスチャーのほうが精度が高いよ!
orientationは「ー」や「|」のような簡単なジェスチャほど影響を受けやすいね。注意しよう!

ジェスチャーを認識する

ユーザーがジェスチャーを入力した後は、どれぐらい似ているかというスコアを算出してスコアを基準にどのテンプレートのジェスチャーが入力されたのかを判断します。開発者はGestureOverlayViewでジェスチャーを受け取り、テンプレートと比較する処理をコーディングする必要があります。

サンプルコード(GestureOverlayViewにリスナを追加)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);
    }

GestureOverlayViewクラスのaddOnGesturePerformedListenerメソッドはインターフェイスの登録です。ジェスチャーの入力があったときに呼び出されます。

サンプルコード(認識する)

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList predictions = mLibrary.recognize(gesture);
    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);
        // 1.0より低スコアは不十分な値なため、不合格とする
        if (prediction.score > 1.0) {
            // Show the spell
            Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
        }

onGesturePerformedメソッドでGestureOverlayView とユーザーが入力したGestureを受け取ります。
ここでGestureLibrariesのrecognizeメソッドをつかって認識処理を行いましょう。

それぞれのテンプレートと比較したスコア「predictions」を取得して、どれだけ似てるかを判定します。
ひとつの目安として、このスコアが1.0以上であればよく似ていると言えます。ただし、predictionsはテンプレートに登録されているジェスチャーによって大きく値が異なるので最適な閾値は、試行錯誤して調整が必要です。

テンプレートの準備など手間がかかる箇所もありますが、ジェスチャーの魅力は

  • 直感的なショートカットなど独自機能の提供が簡単
  • 認識アルゴリズムなど複雑な処理をSDKがサポート

などがあります。第3回で、ジェスチャーについての連載は、おしまいです。
いかがだったでしょうか?参考になれば幸いです、おつかれさまでしたメェ!