Cử chỉ chạm

Bạn có thể truy cập dữ liệu thô từ bàn di chuột Glass bằng SDK Android.

Tuy nhiên, GDK cung cấp trình phát hiện cử chỉ tự động phát hiện các cử chỉ phổ biến trên Glass, bao gồm nhấn, vuốt và cuộn.

Ngoài ra, các cử chỉ đơn giản được chuyển thành Các sự kiện trên D-pad theo mặc định để dễ dàng xử lý mà không cần bằng trình phát hiện cử chỉ.

Phát hiện cử chỉ dưới dạng sự kiện phím trên D-pad

Theo mặc định, hệ thống Glass sẽ chuyển các cử chỉ đơn giản thành các sự kiện phím trên D-pad. Chiến dịch này giúp bạn nghe onKeyDown()onKeyUp() sự kiện trên hoạt động hoặc chế độ xem để xử lý các cử chỉ sau dưới dạng phím D-pad:

Đoạn mã sau đây phát hiện khi người dùng nhấn xuống trên bàn di chuột:

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);
    }
}

Phương pháp phát hiện lượt nhấn trên từng khung hiển thị là triển khai OnClickListener cho chế độ xem. Khi người dùng nhấn vào bàn di chuột (được dịch là nhấp vào nút giữa của D-pad) với khung hiển thị đang được lấy làm tâm điểm, thì khung hiển thị đó có thể xử lý sự kiện bằng một 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
    }
}

Phát hiện cử chỉ bằng trình phát hiện cử chỉ

Trình phát hiện cử chỉ cũng cho phép bạn phát hiện các cử chỉ đơn giản như các cử chỉ phức tạp hơn, chẳng hạn như thao tác sử dụng nhiều ngón tay hoặc cuộn. Phức tạp cử chỉ không có phím tương ứng trên D-pad.

GestureDetector cung cấp các giao diện trình nghe mà bạn có thể triển khai được thông báo về một Cử chỉ.

Phát hiện cử chỉ ở cấp hoạt động

Việc phát hiện các cử chỉ ở cấp hoạt động là phù hợp khi bạn không quan tâm đến phần nào trên giao diện người dùng có trọng tâm. Ví dụ: nếu bạn muốn hiển thị một trình đơn khi người dùng nhấn vào bàn di chuột, bất kể chế độ xem nào có tiêu điểm, bạn sẽ xử lý MotionEvent bên trong hoạt động.

Sau đây là ví dụ:

  1. Tạo GestureDetector giúp triển khai trình nghe để xử lý các cử chỉ được nhận dạng.
  2. Ghi đè phương thức onGenericMotionEvent() của hoạt động để truyền các sự kiện chuyển động đến trình phát hiện cử chỉ onMotionEvent().

Khi một sự kiện chuyển động xảy ra, hệ thống sẽ chuyển sự kiện đó đến trình phát hiện cử chỉ. Nếu nhận dạng được, trình phát hiện cử chỉ sẽ thông báo cho trình nghe thích hợp để xử lý sự kiện.

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;
    }
}

Phát hiện cử chỉ ở cấp chế độ xem

Việc phát hiện các cử chỉ ở cấp chế độ xem là phù hợp khi bạn muốn làm những việc khác nhau tuỳ thuộc vào chế độ xem nào có tâm điểm.

Sau đây là ví dụ:

  1. Tạo khung hiển thị tuỳ chỉnh ghi đè phương thức dispatchGenericFocusedEvent() . Khi một sự kiện chuyển động xảy ra, phương thức này sẽ truyền sự kiện chuyển động đó đến trình phát hiện cử chỉ.
  2. Khai báo khung hiển thị có thể làm tâm điểm để phát hiện các sự kiện khi có tâm điểm.
  3. Tạo GestureDetector để triển khai trình nghe xử lý các cử chỉ được nhận dạng.

Khi trình phát hiện cử chỉ nhận ra một chuyển động trong khi khung hiển thị đang được lấy tiêu điểm, trình phát hiện cử chỉ sẽ gọi trình nghe thích hợp.

/**
 * 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;
    }
}