Google Glassでキーイベントとジェスチャーを取得する

こんにちは、KID.Aです。

今回はGoogle Glassでイベントの取得方法に関する記事を書きます。
イベント取得できれば、ユーザの操作を検知するアプリを作ることができます。

Google Glassでアプリを作る場合は、Android端末で作るアプリと異なり、ディスプレイのタッチがありません。代わりにタッチパッドを使用して、操作を行います。また、Google Glassはキャプチャーボタンなどのハードキーを持っています。

上記のイベントに関して、キーイベントとジェスチャーで取得する方法を説明していきます。

キーイベントを使用する

キーイベントは以下のように、定義されています。

KEYCODE_BACK スワイプダウン
KEYCODE_CAMERA キャプチャーボタン
KEYCODE_DPAD_CENTER タッチパッドをタップ

実装方法

public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // タップ
            return true;
        }
        if (keycode == KeyEvent.KEYCODE_CAMERA) {
            // キャプチャーボタン
            return true;
        }
        if (keycode == KeyEvent.KEYCODE_BACK) {
            // 下スワイプ
            return true;
        }
        return super.onKeyDown(keycode, event);
    }
}

onKeyDownをOverrideすると、keycodeに通知されます。

GestureDetectorを使用する

また、タッチパッドでダブルタップやスライドなどの細かいイベントを取得したい場合は、GestureDetectorを使用します。

実装方法

public class MainActivity extends Activity {

    private GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        mGestureDetector = createGestureDetector(this);
    }

    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gestureDetector = new GestureDetector(context);
        //Create a base listener for generic gestures
        gestureDetector.setBaseListener(new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    // 1本の指でタップ
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // 2本の指でタップ
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // 右にスワイプ
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // 左にスワイプ
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
                    // タッチしている指の数が変わった場合に通知される
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                    // 横スクロール時に通知される
                return false;
            }
        });
        return gestureDetector;
    }

    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }

}

onGestureにはタップやスワイプのジェスチャーがGestureで取得できます。

onFingerCountChangedでは、タッチしている指の数が変わった場合に通知されます。
previousCountには変わる前のタッチしている指の本数、currentCountは変わった後の指の本数がきます。

setScrollListenerでは横スクロールされた場合に通知がきます。
displacementには初回タッチした位置からの移動したX軸の距離が返却されます。
deltaにはX軸の連続したモーションイベント間の差分が返却されます。
velocityには現在のX軸のモーションイベントの速さが返却されます。

以上、イベント取得の実装の際に参考にして頂けると幸いです。

KID.A

KID.A の紹介

楽して生きることと一発逆転を夢見ている、ちゃきちゃきのAndroiderです。
いろいろアプリを出しているのですが、いつもリリース後にターゲットユーザ数を2桁見誤っていたことに気付くので、残念でなりません。下方修正で、ヒットがでません。おしいです。

明日から本気出します。
よろしくお願いします。

カテゴリー: Android タグ: , , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です