タップ操作

Glass のタッチパッドから元データにアクセスするには、 ダウンロードします

ただし、GDK には 検出機能を実装して 一般的なジェスチャーを、 タップ、スワイプ、スクロールなどです

また、単純なジェスチャーが Google Cloud の D-pad イベントをデフォルトで設定し、変更なしで簡単に処理 生成します。

ジェスチャーを D-pad キーイベントとして検出する

デフォルトでは、Glass システムは簡単なジェスチャーを D-pad のキーイベントに変換します。この では、 onKeyDown() および onKeyUp() イベントは、次のジェスチャーを D-pad キーとして処理します。

次のスニペットは、ユーザーがタッチパッドをタップしたことを検出します。

public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // user tapped touchpad, do something
            return true;
        }
        ...
        return super.onKeyDown(keycode, event);
    }
}

個々のビューのタップを検出する方法は、 OnClickListener 指定します。ユーザーがタッチパッドをタップしたとき(D-pad の中央ボタンのクリックに変換) ビューがフォーカスされている場合、ビューは OnClickListener

public final class MyActivity extends Activity implements OnClickListener {

    View cardView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        cardView = new Card(this).setText("Tap to carry out an action").getView();
        // To receive touch events from the touchpad, the view should be focusable.
        cardView.setOnClickListener(this);
        cardView.setFocusable(true);
        cardView.setFocusableInTouchMode(true);
        setContentView(cardView);
    }

    @Override
    protected void onResume() {
        // To receive touch events from the touchpad, the view should have focus.
        cardView.requestFocus();
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        // perform desired action
    }
}

ジェスチャー検出機能によるジェスチャー検出

ジェスチャー検出機能では、シンプルなジェスチャーも検出できます。 複雑なジェスチャーのように 指やスクロールなどの操作を行えます複雑 ジェスチャーに対応する D-pad キーはありません。

GestureDetector リスナー インターフェースが用意されており、 ジェスチャーの通知を受け取る必要があります。

アクティビティ レベルの操作の検出

アクティビティ レベルでジェスチャーを検出することが適切である UI のどの部分を 焦点を当てています。たとえば、CPU 使用率のしきい値を超えたメニューを どのビューにフォーカスがある場合でも MotionEvent を処理します。 使用します。

次の例では、以下を実行します。

  1. GestureDetector を作成します。 これは、認識されたジェスチャーを処理するリスナーを実装するものです。
  2. アクティビティの onGenericMotionEvent() メソッドをオーバーライドして、モーション イベントをジェスチャー検出機能に渡します。 onMotionEvent() メソッドを使用します。

モーション イベントが発生すると、システムはそれをジェスチャー検出機能に渡します。条件 認識されると、ジェスチャー検出機能は適切なリスナーに処理を通知します。 追加できます。

public class MainActivity extends Activity {
    private GestureDetector mGestureDetector;
    // ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        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) {
                    // do something on tap
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // do something on two finger tap
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // do something on right (forward) swipe
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // do something on left (backwards) swipe
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
              // do something on finger count changes
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                // do something on scrolling
            }
        });
        return gestureDetector;
    }

    /*
     * Send generic motion events to the gesture detector
     */
    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }
}

ビューレベルの操作の検出

ビューレベルで操作を検出するのは、 どのビューがフォーカスされているかによって、異なる処理を実行できます。

次の例では、以下を実行します。

  1. オーバーライドするカスタムビューを作成し、 dispatchGenericFocusedEvent() メソッドを呼び出します。モーション イベントが発生すると、このメソッドはモーション イベントをジェスチャー検出機能に渡します。
  2. ビューをフォーカス可能として宣言し、フォーカスを取得したときにイベントを検出できるようにします。
  3. 次の実装を行う GestureDetector を作成します。 認識されたジェスチャーを処理できます。

ビューにフォーカスがあるときにジェスチャー検出機能が動きを認識すると、適切なリスナーが呼び出されます。

/**
 * TextView that handles touchpad input (currently only TAP).
 */
public class TouchpadHandlingTextView extends TextView
        implements OnAttachStateChangeListener{

    private final GestureDetector mTouchDetector;

    public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchDetector = createGestureDetector(context);
        // must set the view to be focusable
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    public TouchpadHandlingTextView(Context context) {
        this(context, null);
    }

    @Override
    public void onViewAttachedToWindow(View v) {
        requestFocus();
    }

    @Override
    public void onViewDetachedFromWindow(View v) {
    }

    /**
     * Pass a MotionEvent into the gesture detector
     */
    @Override
    public boolean dispatchGenericFocusedEvent(MotionEvent event) {
        if (isFocused()) {
            return mTouchDetector.onMotionEvent(event);
        }
        return super.dispatchGenericFocusedEvent(event);
    }

    /**
     * Create gesture detector that triggers onClickListener. Implement
     * onClickListener in your Activity and override
     * onClick() to handle the "tap" gesture.
     */
    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gd = new GestureDetector(context);
        gd.setBaseListener(new GestureDetector.BaseListener() {

            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    return performClick();
                }
                return false;
            }
        });
        return gd;
    }
}