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()
và 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:
- Nhấn để dịch sang
KEYCODE_DPAD_CENTER
. - Nhấn nút máy ảnh sẽ chuyển thành
KEYCODE_CAMERA
. - Vuốt xuống sẽ chuyển thành
KEYCODE_BACK
.
Đ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:
- Tạo một
GestureDetector
triển khai trình nghe để xử lý các cử chỉ được nhận dạng. - 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ứconMotionEvent()
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:
- 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ỉ. - 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.
- 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;
}
}