Mengakses data mentah dari touchpad Glass dapat dilakukan dengan Android SDK.
Namun, GDK menyediakan detektor gestur yang otomatis mendeteksi gestur umum di Glass, termasuk mengetuk, menggeser, dan men-scroll.
Selain itu, gestur sederhana diterjemahkan menjadi peristiwa D-pad secara default untuk pemrosesan yang mudah tanpa menggunakan detektor gestur.
Mendeteksi gestur sebagai peristiwa tombol D-pad
Secara default, sistem Glass menerjemahkan gestur sederhana ke dalam peristiwa tombol D-pad. Hal ini
memungkinkan Anda memproses
peristiwa onKeyDown()
dan onKeyUp()
pada aktivitas atau tampilan untuk memproses gestur berikut sebagai tombol D-pad:
- Ketuk akan diterjemahkan ke
KEYCODE_DPAD_CENTER
. - Penekanan tombol kamera berarti
KEYCODE_CAMERA
. - Geser ke bawah untuk menerjemahkan ke
KEYCODE_BACK
.
Cuplikan berikut mendeteksi saat pengguna mengetuk touchpad:
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);
}
}
Metode untuk mendeteksi ketukan pada setiap tampilan adalah dengan mengimplementasikan
OnClickListener
untuk tampilan. Saat pengguna mengetuk touchpad (diterjemahkan sebagai klik tombol tengah D-pad)
dengan tampilan dalam fokus, tampilan dapat menangani peristiwa dengan
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
}
}
Mendeteksi gestur dengan detektor gestur
Pendeteksi gestur memungkinkan Anda mendeteksi gestur sederhana serta gestur yang lebih kompleks, seperti yang menggunakan beberapa jari atau scroll. Gestur yang kompleks tidak memiliki tombol D-pad yang sesuai.
GestureDetector menyediakan antarmuka pemroses yang dapat Anda implementasikan untuk mendapatkan notifikasi tentang Gestur.
Mendeteksi gestur tingkat aktivitas
Mendeteksi gestur di level aktivitas
sesuai jika Anda tidak peduli bagian mana dari UI yang
akan difokuskan. Misalnya, jika Anda ingin memunculkan menu
saat pengguna mengetuk touchpad, terlepas dari tampilan yang memiliki fokus,
Anda harus menangani MotionEvent
di dalam aktivitas.
Contoh berikut:
- Membuat
GestureDetector
yang mengimplementasikan pemroses untuk memproses gestur yang dikenali. - Mengganti metode
onGenericMotionEvent()
aktivitas untuk meneruskan peristiwa gerakan ke metodeonMotionEvent()
detektor gestur.
Saat peristiwa gerakan terjadi, sistem akan meneruskannya ke detektor gestur. Jika dikenali, detektor gestur memberi tahu pemroses yang sesuai untuk memproses peristiwa tersebut.
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;
}
}
Mendeteksi gestur tingkat tampilan
Mendeteksi gestur pada tingkat tampilan akan sesuai jika Anda ingin melakukan hal-hal berbeda, bergantung pada tampilan yang memiliki fokus.
Contoh berikut:
- Membuat tampilan kustom yang menggantikan
metode
dispatchGenericFocusedEvent()
. Saat peristiwa gerakan terjadi, metode ini meneruskan peristiwa gerakan ke detektor gestur. - Mendeklarasikan tampilan agar dapat difokuskan sehingga mendeteksi peristiwa saat memiliki fokus.
- Membuat
GestureDetector
yang mengimplementasikan pemroses untuk memproses gestur yang dikenali.
Saat detektor gestur mengenali gerakan saat tampilan dalam fokus, detektor gestur memanggil pemroses yang sesuai.
/**
* 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;
}
}