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()
và 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:
- Nhấn vào biểu tượng dịch sang
KEYCODE_DPAD_CENTER
. - Nhấn nút máy ảnh để dịch sang
KEYCODE_CAMERA
. - Vuốt xuống sẽ dịch sang
KEYCODE_BACK
.
Đ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ụ:
- Tạo
GestureDetector
giúp 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 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ụ:
- 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ỉ. - 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.
- 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;
}
}