X

ジェスチャーに対応する(2)Gestureを読み込む

前回、ジェスチャーに対応する(1):Gesture Builderを使うではジェスチャーの作り方を解説しました。下記Listの1の部分にあたります。

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

今回は”2.作成したジェスチャーを登録する”について解説します。
GestureLibrariesを使ったジェスチャーデータのロード(Gesture Builderで作ったデータをテンプレートとして使う)方法と、認識されやすいジェスチャーの作り方、注意点についてまとめました。

では続きをどうぞ

認識されやすいGestureとされにくいGestureの差


前回、Gesture Builderで作成したテンプレートデータには、複数のジェスチャーが含まれています。それらジェスチャーデータを読み込み、使えるようにするのがGestureLibrariesです。
ジェスチャーライブラリーは、ジェスチャーを複数管理する、という面倒な要素を上手く隠蔽していますが、
認識率の良いジェスチャーをテンプレートとして登録するためには、内部構成について少し知っておく必要があります。

ジェスチャーはストローク(Stroke)と呼ばれる「一筆書き」、「一画」程度の要素に分解できます(樹形図を見てください)。
いくつかのストロークが組み合わさって1つのジェスチャーを構成しています。そのため、複雑な書き順、沢山の画数であればあるほど認識は難しくなります。

認識されやすいGestureの特徴

  • ジェスチャのストロークは1つのほうが認識されやすい=一筆書きが可能であること
  • 一筆書きでも簡単すぎるとジェスチャーの認識率が下がる(|や―などあまりにシンプルすぎると誤認識しやすいため、△や□など一筆書きしやすい記号を使うと良いでしょう)
  • ストロークは点の集合、テンプレートは丁寧に作る

最後の1つについては、テンプレートを作る際の注意点に近いですが、前述のストロークもいくつかの点(GesturePoint)から構成されています。
テンプレートを作成するときに、タッチスクリーン上を素早く動かして書いてしまうと、得られるGesturePointも少なくなり、テンプレートとしての精度が下がってしまいます。出来るだけ丁寧に作るように心がけてください。

GestureLibrariesでジェスチャーを読み込む

まず前回作成したテンプレートデータをリソースとして登録します

res/raw/gesture

Rawデータとして登録したgestureテンプレートはGestureLibrariesを使って読み込むことが出来ます。

GestureActivity.java

    private GestureLibrary mLibrary;

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mLibrary = GestureLibraries.fromRawResource(this, R.raw.gesture);
        if (!mLibrary.load()) {
        	finish();
        }

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

サンプルコード、8行目でリソースからテンプレートデータの読み込み先を設定します。
9行目で実際にデータを読み込んでいます。テンプレートデータのサイズが大きい場合は、Activityと別threadで実施したほうが良いでしょう
(ロード時にファイルアクセスを伴う場合もあるためANRになるかもしれません)。

GestureLibrariesのメソッドは以下の通りです。ファイルやリソースからテンプレートデータを読み込むことが可能です。

  • static GestureLibrary fromFile(File path)
  • static GestureLibrary fromFile(String path)
  • static GestureLibrary fromPrivateFile(Context context, String name)
  • static GestureLibrary fromRawResource(Context context, int resourceId)

Activityでテンプレートを読み込み、ジェスチャーライブラリにロードするところまで順調に進みました。
次回はGestureOverlayView を使ってユーザーにジェスチャーを入力してもらい、認識してみましょう。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org