Cử chỉ chạm

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

Tuy nhiên, GDK cung cấp một 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 cử chỉ 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 D-pad theo mặc định để dễ dàng xử lý mà không cần sử dụng trình phát hiện cử chỉ.

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

Theo mặc định, hệ thống Glass dịch các cử chỉ đơn giản thành các sự kiện phím D-pad. Thao tác này cho phép bạn theo dõi các sự kiện onKeyDown()onKeyUp() về các 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 thời điểm người dùng nhấn vào 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);
    }
}

Một phương thức để phát hiện các lượt nhấn trên các thành phần hiển thị riêng lẻ là triển khai OnClickListener cho thành phần hiển thị đó. Khi người dùng nhấn vào bàn di chuột (được dịch là một lượt nhấp vào nút giữa bàn phím di chuyển) trong khung nhìn có tiêu điểm, thành phần hiển thị đó có thể xử lý sự kiện bằng 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ỉ cho phép bạn phát hiện các cử chỉ đơn giản cũng như các cử chỉ phức tạp hơn, chẳng hạn như các cử chỉ sử dụng nhiều ngón tay hoặc cuộn. Các cử chỉ phức tạp không có phím D-pad tương ứng.

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 Gesture (Cử chỉ).

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

Việc phát hiện cử chỉ ở cấp độ hoạt động sẽ phù hợp khi bạn không quan tâm đến phần trọng tâm của giao diện người dùng. Ví dụ: nếu 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 có tiêu điểm là gì, bạn sẽ xử lý MotionEvent bên trong hoạt động.

Ví dụ sau đây:

  1. Tạo một GestureDetector 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 phương thức onMotionEvent() của trình phát hiện cử chỉ.

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 được nhận dạng, 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ử chỉ ở cấp chế độ xem thích hợp khi bạn muốn làm nhiều việc tuỳ thuộc vào chế độ xem có tiêu điểm.

Ví dụ sau đây:

  1. Tạo thành phần 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ẽ chuyển sự kiện chuyển động đó tới trình phát hiện cử chỉ.
  2. Khai báo thành phần hiển thị có thể lấy tiêu điểm để phát hiện các sự kiện khi có tiêu điểm.
  3. Tạo một 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 chuyển động trong khi chế độ xem đang ở tâm đ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;
    }
}